Sto essenzialmente cercando di scrivere un'interfaccia console con input e output per uno script python integrato. Seguendo le istruzioni here, sono stato in grado di catturare stdout:Reindirizza in modo asincrono stdout/stdin da python incorporato 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();
Il problema di questo è che ricevo solo lo stdout dopo lo script ha terminato l'esecuzione, mentre in posizione ideale per una console della stdoutstring avrebbe aggiornare il lo script python lo aggiorna. C'è un modo per fare questo?
Inoltre, come fare per acquisire lo stdin?
Se aiuta, sto lavorando con un compilatore che accetta Objective-C. Ho anche le librerie di boost disponibili.
Ho capito la parte stdout della domanda. Per i posteri, questo funziona:
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();
avere ancora problemi con stdin ...
PS. grazie per le tue soluzioni di cui sopra, li ho trovati abbastanza utili! – Dave