// -*- mode: c++ -*- // Copyright 2011, Florent Lamiraux, CNRS. // // This file is part of dynamic-graph-python. // dynamic-graph is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // dynamic-graph is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Lesser Public License for more details. You should have // received a copy of the GNU Lesser General Public License along with // dynamic-graph. If not, see . #include #include "dynamic-graph/debug.h" #include "dynamic-graph/python/interpreter.hh" #include "link-to-python.hh" std::ofstream dg_debugfile( "/tmp/dynamic-graph-traces.txt", std::ios::trunc&std::ios::out ); // Python initialization commands namespace dynamicgraph { namespace python { static const std::string pythonPrefix[5] = { "import traceback\n", "def display(s): return str(s) if not s is None else None", "class StdoutCatcher:\n" " def __init__(self):\n" " self.data = ''\n" " def write(self, stuff):\n" " self.data = self.data + stuff\n" " def fetch(self):\n" " s = self.data[:]\n" " self.data = ''\n" " return s\n" "stdout_catcher = StdoutCatcher()\n" "import sys\n" "sys.stdout = stdout_catcher" }; } } namespace dynamicgraph { namespace python { bool HandleErr(std::string & err, PyObject * traceback_format_exception, PyObject * globals_, int PythonInputType) { dgDEBUGIN(15); err=""; bool lres=false; if (PyErr_Occurred()) { PyObject *ptype, *pvalue, *ptraceback, *pyerr; PyErr_Fetch(&ptype, &pvalue, &ptraceback); if (ptraceback == NULL) { ptraceback = Py_None; // increase the Py_None count, to avoid a crash at the tuple destruction Py_INCREF(ptraceback); } PyObject* args = PyTuple_New(3); PyTuple_SET_ITEM(args, 0, ptype); PyTuple_SET_ITEM(args, 1, pvalue); PyTuple_SET_ITEM(args, 2, ptraceback); pyerr = PyObject_CallObject(traceback_format_exception, args); assert(PyList_Check(pyerr)); Py_ssize_t size = PyList_GET_SIZE(pyerr); std::string stringRes; for (Py_ssize_t i=0; i(argv)); } std::string Interpreter::processStream(std::istream& stream, std::ostream& os) { char line[10000]; sprintf(line, "%s", "\n"); std::string command; std::streamsize maxSize = 10000; #if 0 while (line != std::string("")) { stream.getline(line, maxSize, '\n'); command += std::string(line) + std::string("\n"); }; #else os << "dg> "; stream.getline(line, maxSize, ';'); command += std::string(line); #endif return command; } } //namespace python } // namespace dynamicgraph