मैं अनिवार्य रूप से एक एम्बेडेड पायथन लिपि के लिए इनपुट और आउटपुट के साथ एक कंसोल इंटरफेस लिखने की कोशिश कर रहा हूं।असीमित रूप से एम्बेडेड पायथन से C++ में stdout/stdin को पुनर्निर्देशित करें?
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();
इस के साथ समस्या यह है कि मैं केवल, चालू स्क्रिप्ट पूर्ण होने के बाद stdout प्राप्त जबकि आदर्श रूप से एक कंसोल के लिए stdoutstring के रूप में अद्यतन होता है: निर्देश here के बाद, मैं stdout पर कब्जा करने में सक्षम था पायथन लिपि इसे अद्यतन करता है। क्या इसे करने का कोई तरीका है?
इसके अलावा, मैं कैसे stdin पर कब्जा करने के बारे में जाना होगा?
यदि यह मदद करता है, मैं एक संकलक कि ऑब्जेक्टिव-सी स्वीकार करता है के साथ काम कर रहा हूँ। मेरे पास बूस्ट लाइब्रेरी भी उपलब्ध हैं।
मैं सवाल का stdout हिस्सा निकाला है। भावी पीढ़ी के लिए, यह काम करता है:
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();
stdin के साथ अभी भी हो रही परेशानी ...
पुनश्च:
आप इसके साथ परीक्षण कर सकते हैं। उपरोक्त आपके समाधान के लिए धन्यवाद, मैंने उन्हें काफी मददगार पाया! – Dave