使用C API以异步方式打印到控制台

时间:2015-10-13 16:19:16

标签: python c multithreading python-2.7 python-3.4

我正在使用IDL编程语言连接Python。我在Windows,Linux和Mac上使用Python C API(2.7和3.4)。 Python解释器在主线程中运行,而IDL在单独的线程中运行。我正在尝试将IDL线程的输出重新路由到Python控制台。这是一段代码:

PyObject *tmp;
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject* pyStdout = PySys_GetObject("stdout");
// buf is a null-terminated char*
PyObject* pyOutput = PyString_FromFormat("%s", buf);
PyFile_WriteObject(pyOutput, pyStdout, Py_PRINT_RAW);
Py_DECREF(pyOutput);
tmp = PyObject_CallMethod(pyStdout, "flush", NULL);
if (tmp != NULL) Py_DECREF(tmp);
PyGILState_Release(gstate);

输出显示在Python控制台上,但Python提示符最终位于中间位置。例如,打印数字1-5:

>>> IDL.run('@batch.pro')
       1
>>>        2
       3
       4
       5

此时,输入Python控制台将消除最后几行输出。结果并不总是一致的,也取决于控制台。使用Windows“cmd”控制台,它总是搞砸了。在Linux上使用IPython QTConsole或控制台可以更好地工作,但仍然会在输出中间出现提示。

我尝试了一种使用print()的不同方法,但它没有帮助:

PyObject* pyBuiltIn = PyImport_ImportModule(PY_BUILTIN);
PyObject *tmp = PyObject_CallMethod(pyBuiltIn, "print", "s", buf);
if (tmp != NULL) Py_DECREF(tmp);
Py_DECREF(pyBuiltIn);

我使用Python 2.7和3.4获得相同的行为。是否有不同的机制将输出发送到异步工作的Python控制台?这一定是可能的,因为如果你创建一个非阻塞的Python小部件(比如说使用tkinter),你就可以成功发送输出。在此先感谢您的帮助!

0 个答案:

没有答案