使用Python C API异步打印到控制台

使用Python C API异步打印到控制台,python,c,multithreading,python-2.7,python-3.4,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

我正在用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”控制台,它总是一团糟。使用IPython Qt控制台或Linux上的控制台工作得更好,但在输出中间仍然有提示。

我使用print()尝试了另一种方法,但没有效果:

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

我使用Python2.7和3.4获得了相同的行为。是否有不同的机制将输出发送到异步工作的Python控制台?这必须是可能的,因为如果您创建一个非阻塞Python小部件(比如使用tkinter),您就可以成功地发送输出。提前感谢您的帮助

@Chad Simmons只是好奇,你为什么删除标题中的“Python”一词?它似乎需要“Python C API”,否则就不清楚它指的是什么API了?标记已经对它进行了分类,但我会编辑以添加Clarity我对Python了解不多,但从描述来看,似乎您需要围绕Python控制台进行自己的同步。@Chad Simmons只是好奇,为什么您删除了“Python”这个词在标题中?它似乎需要“Python C API”,否则就不清楚它指的是什么API了?标签已经对它进行了分类,但我将进行编辑以添加Clarity我对Python了解不多,但从描述来看,似乎您需要围绕Python控制台进行自己的同步。。?