15 std::ofstream
dg_debugfile(
"/tmp/dynamic-graph-traces.txt",
16 std::ios::trunc& std::ios::out);
22 "from __future__ import print_function\n",
24 "class StdoutCatcher:\n"
25 " def __init__(self):\n"
27 " def write(self, stuff):\n"
28 " self.data = self.data + stuff\n"
33 "stdout_catcher = StdoutCatcher()\n",
34 "stderr_catcher = StdoutCatcher()\n",
36 "sys.stdout = stdout_catcher",
37 "sys.stderr = stderr_catcher"};
39 bool HandleErr(std::string& err, PyObject* globals_,
int PythonInputType) {
44 if (PyErr_Occurred() != NULL) {
45 bool is_syntax_error = PyErr_ExceptionMatches(PyExc_SyntaxError);
47 PyObject* stderr_obj = PyRun_String(
"stderr_catcher.fetch()", Py_eval_input,
50 Py_DECREF(stderr_obj);
56 if (is_syntax_error && PythonInputType == Py_eval_input) {
57 dgDEBUG(15) <<
"Detected a syntax error " << std::endl;
64 dgDEBUG(15) <<
"no object generated but no error occured." << std::endl;
73 dlopen(PYTHON_LIBRARY, RTLD_LAZY | RTLD_GLOBAL);
76 #if PY_MAJOR_VERSION < 3 || PY_MINOR_VERSION < 7
79 mainmod_ = PyImport_AddModule(
"__main__");
92 PyRun_SimpleString(
"import linecache");
107 PyObject* poAttrList = PyObject_Dir(
mainmod_);
108 PyObject* poAttrIter = PyObject_GetIter(poAttrList);
109 PyObject* poAttrName;
111 while ((poAttrName = PyIter_Next(poAttrIter)) != NULL) {
112 std::string oAttrName(
obj_to_str(poAttrName));
115 if (oAttrName.compare(0, 2,
"__") != 0 ||
116 oAttrName.compare(oAttrName.size() - 2, 2,
"__") != 0) {
117 PyObject* poAttr = PyObject_GetAttr(
mainmod_, poAttrName);
120 if (poAttr && poAttr->ob_type !=
mainmod_->ob_type)
121 PyObject_SetAttr(
mainmod_, poAttrName, NULL);
126 Py_DECREF(poAttrName);
129 Py_DECREF(poAttrIter);
130 Py_DECREF(poAttrList);
139 std::string lerr(
""), lout(
""), lres(
"");
140 python(command, lres, lout, lerr);
145 std::string& out, std::string& err) {
151 std::string::size_type iFirstNonWhite = command.find_first_not_of(
" \t");
153 if (iFirstNonWhite == std::string::npos)
return;
155 if (command[iFirstNonWhite] ==
'#')
return;
159 std::cout << command.c_str() << std::endl;
163 if (result == NULL) {
178 dgDEBUG(15) <<
"Do not try a second time." << std::endl;
181 PyObject* stdout_obj = 0;
185 Py_DECREF(stdout_obj);
187 if (out.size() != 0) std::cout <<
"Output:" << out << std::endl;
188 if (err.size() != 0) std::cout <<
"Error:" << err << std::endl;
191 dgDEBUG(15) <<
"For command: " << command << std::endl;
192 if (result != NULL) {
194 dgDEBUG(15) <<
"Result is: " <<
res << std::endl;
197 dgDEBUG(15) <<
"Result is: empty" << std::endl;
199 dgDEBUG(15) <<
"Out is: " << out << std::endl;
200 dgDEBUG(15) <<
"Err is :" << err << std::endl;
210 std::string err =
"";
215 FILE* pFile = fopen(filename.c_str(),
"r");
217 err = filename +
" cannot be open";
228 std::cerr << err << std::endl;
238 #if PY_MAJOR_VERSION >= 3
239 const Py_UNICODE* argv[] = {
L"dg-embedded-pysh"};
240 Py_Main(1,
const_cast<Py_UNICODE**
>(argv));
242 const char* argv[] = {
"dg-embedded-pysh"};
243 Py_Main(1,
const_cast<char**
>(argv));
250 std::streamsize maxSize = 10000;
251 snprintf(line,
static_cast<size_t>(maxSize),
"%s",
"\n");
254 while (line != std::string(
"")) {
255 stream.getline(line, maxSize,
'\n');
256 command += std::string(line) + std::string(
"\n");
260 stream.getline(line, maxSize,
';');
261 command += std::string(line);