2011-10-28 17 views
12

मैं अनिवार्य रूप से एक एम्बेडेड पायथन लिपि के लिए इनपुट और आउटपुट के साथ एक कंसोल इंटरफेस लिखने की कोशिश कर रहा हूं।असीमित रूप से एम्बेडेड पायथन से 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 के साथ अभी भी हो रही परेशानी ...

उत्तर

1

सभी उपलब्ध इनपुट अजगर के अंदर मैं fileinput मॉड्यूल की सलाह देते हैं संसाधित करने के लिए।

यदि आप इनपुट-लाइन-लाइन कमांड के रूप में इनपुट को संभालना चाहते हैं, (जैसे इंटरैक्टिव दुभाषिया में), तो आपको पाइथन फ़ंक्शन raw_input उपयोगी मिल सकता है।

ऐसे हैं जिन्हें आप ऊपर का उपयोग किया है के रूप में एक समान सहायक वर्ग का उपयोग कर stdin पुनर्निर्देशित करने के लिए, समारोह ओवरराइड करने के लिए ReadLine है, नहीं पढ़ें। उस पर अधिक जानकारी के लिए this link देखें (और raw_input)।

आशा इस मदद करता है, Supertwang

+0

पुनश्च:

PyObject *sys = PyImport_ImportModule("sys"); PyObject* io_stdout = PyFile_FromFile(stdout, "stdout", "a", nullptr); PyObject_SetAttrString(sys, "stdout", io_stdout); PyObject* io_stderr = PyFile_FromFile(stderr, "stderr", "a", nullptr); PyObject_SetAttrString(sys, "stderr", io_stderr); PyObject* io_stdin = PyFile_FromFile(stdin, "stdin", "r", nullptr); PyObject_SetAttrString(sys, "stdin", io_stdin); 

आप इसके साथ परीक्षण कर सकते हैं। उपरोक्त आपके समाधान के लिए धन्यवाद, मैंने उन्हें काफी मददगार पाया! – Dave

0

आप दृष्टिकोण आप उल्लिखित के साथ चिपके रहते हैं, तो io.IOBase से अपने वर्ग इनहेरिट शायद एक अच्छा विचार है।

1

सबसे आसान तरीका मैं अब तक पाया इस प्रकार है क्या करने के लिए:

# for test 
PyRun_SimpleString("print sys.stdin.readline()");