ultimatepp/bazaar/PyCon/PyCon.cpp
kohait 3679491ce2 bazaar: PyCon, PyConsoleCtrl: proper exit() python funciton handling, now exit handler can terminate gui app
git-svn-id: svn://ultimatepp.org/upp/trunk@3337 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-04-12 21:54:26 +00:00

95 lines
2 KiB
C++

#include "PyCon.h"
PyObject* PyCon::ToStdOut(PyObject* self, PyObject* pArgs)
{
char* ps = NULL;
if(!PyArg_ParseTuple(pArgs, "s", &ps))
return NULL;
String s(ps);
GetStream().Put(ps);
Py_INCREF(Py_None);
return Py_None;
}
PyObject* PyCon::ToStdErr(PyObject* self, PyObject* pArgs)
{
char* ps = NULL;
if(!PyArg_ParseTuple(pArgs, "s", &ps))
return NULL;
String s(ps);
GetStream().Put(ps);
Py_INCREF(Py_None);
return Py_None;
}
PyMethodDef PyCon::m[] =
{
{ "ToStdOut", ToStdOut, METH_VARARGS, "writes to stdout" },
{ "ToStdErr", ToStdErr, METH_VARARGS, "writes to stderr" },
{ NULL, NULL, 0, NULL }
};
Callback PyCon::AtExit;
bool PyCon::enabled = false;
Stream* PyCon::ps = NULL;
void PyCon::Init()
{
ONCELOCK
{
Py_Initialize(); //make sure, since we are static
Py_InspectFlag = 1; //need to process exit ourselves
Py_InitModule3("log", PyCon::m, "Logs stdout and stdin");
PyRun_SimpleString (
"import sys\n"
"import log\n"
"class StdOutIncept:\n"
"\tdef write(self, str):\n"
"\t\tlog.ToStdOut(str)\n"
"class StdErrIncept:\n"
"\tdef write(self, str):\n"
"\t\tlog.ToStdErr(str)\n"
);
}
Enable();
}
void PyCon::Enable(bool b)
{
if(enabled = b)
PyRun_SimpleString (
"sys.stdout = StdOutIncept()\n"
"sys.stderr = StdErrIncept()\n"
);
else
PyRun_SimpleString (
"sys.stdout = sys.__stdout__\n"
"sys.stderr = sys.__stderr__\n"
);
}
//for having an echo print of return PyObject, is simply a copy of PyRun_SimpleStringFlags, with Py_single_input
int PyCon::MyPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags, int start)
{
PyObject *m, *d, *v;
m = PyImport_AddModule("__main__");
if (m == NULL)
return -1;
d = PyModule_GetDict(m);
v = PyRun_StringFlags(command, start, d, d, flags);
if (v == NULL) {
bool b = (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit));
PyErr_Print(); //clears error
if(b) AtExit();
return -1;
}
Py_DECREF(v);
if (Py_FlushLine())
PyErr_Clear();
return 0;
}