Estoy tratando esencialmente de escribir una interfaz de consola con entrada y salida para una secuencia de comandos python incrustada. Siguiendo las instrucciones here, yo era capaz de capturar la salida estándar:Redirige asincrónicamente stdout/stdin de python incrustado a C++?
Py_Initialize();
PyRun_SimpleString("\
class StdoutCatcher:\n\
def __init__(self):\n\
self.data = ''\n\
def write(self, stuff):\n\
self.data = self.data + stuff\n\
import sys\n\
sys.stdout = StdoutCatcher()");
PyRun_SimpleString("some script");
PyObject *sysmodule;
PyObject *pystdout;
PyObject *pystdoutdata;
char *string;
sysmodule = PyImport_ImportModule("sys");
pystdout = PyObject_GetAttrString(sysmodule, "stdout");
pystdoutdata = PyObject_GetAttrString(pystdout, "data");
stdoutstring = PyString_AsString(pystdoutdata);
Py_Finalize();
El problema con esto es que yo sólo recibo la salida estándar después el guión ha finalizado la ejecución, mientras que lo ideal para una consola de la stdoutstring actualizaría como el la secuencia de comandos python lo actualiza. ¿Hay alguna forma de hacer esto?
Además, ¿cómo haré para capturar stdin?
Si ayuda, estoy trabajando con un compilador que acepta Objective-C. También tengo las bibliotecas de impulso disponibles.
He descubierto la parte estándar de la pregunta. Para la posteridad, esto funciona:
static PyObject*
redirection_stdoutredirect(PyObject *self, PyObject *args)
{
const char *string;
if(!PyArg_ParseTuple(args, "s", &string))
return NULL;
//pass string onto somewhere
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef RedirectionMethods[] = {
{"stdoutredirect", redirection_stdoutredirect, METH_VARARGS,
"stdout redirection helper"},
{NULL, NULL, 0, NULL}
};
//in main...
Py_Initialize();
Py_InitModule("redirection", RedirectionMethods);
PyRun_SimpleString("\
import redirection\n\
import sys\n\
class StdoutCatcher:\n\
def write(self, stuff):\n\
redirection.stdoutredirect(stuff)\n\
sys.stdout = StdoutCatcher()");
PyRun_SimpleString("some script");
Py_Finalize();
Aún tiene problemas con la entrada estándar ...
PS. gracias por sus soluciones anteriores, ¡las encontré bastante útiles! – Dave