将嵌入式Python IO重定向到使用AllocConsole Win32应用程序创建的控制台

时间:2016-07-31 14:12:23

标签: python redirect python-c-api python-c-extension

我知道有类似的问题,但我解决这个问题的努力没有成功。我想重定向Python解释器I / O,但我只成功重定向stdout。我仍然有stdin和stderr的问题。基于Redirect Embedded Python IO to a console created with AllocConsole我做了这个:

PyObject* sys = PyImport_ImportModule("sys");
PyObject* pystdout = PyFile_FromString("CONOUT$", "wt");
if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
    /* raise errors and wail very loud */
}
PyObject* pystdin = PyFile_FromString("CONIN$", "rb");
if (-1 == PyObject_SetAttrString(sys, "stdin", pystdin)) {
    /* raise errors and wail very loud */
}
//cout << "no error" << endl;
Py_DECREF(sys);
Py_DECREF(pystdout);
Py_DECREF(pystdin);

我有简单的脚本用于测试目的:

print 'Hello'
guess = int(raw_input('Take a guess: '))
print quess

执行我的脚本时,只有第一个打印在控制台上显示。根本没有显示第二和第三个命令。所以,而不是输出:

Hello
Take a guess: "my guess"
"my guess"

我只有

Hello

我很感激任何帮助,需要使用Python C API解决。 感谢。

1 个答案:

答案 0 :(得分:1)

我通过改变一些东西并使用Python 3.x而不是2.x找到了解决方案。如果我们根据Python 3.x标准稍微修改脚本,现在一切正常。

PyObject* sys = PyImport_ImportModule("sys");
if (sys == NULL)
{
    /*show error*/
}
PyObject* io = PyImport_ImportModule("io");
PyObject* pystdout = PyObject_CallMethod(io, "open", "ss", "CONOUT$", "w");
if (pystdout == NULL)
{
    /*show error*/
}
if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout))
{
    /*show error*/
}
PyObject* pystdin = PyObject_CallMethod(io, "open", "ss", "CONIN$", "r");
if (pystdin == NULL)
{
    /*show error*/
}
if (-1 == PyObject_SetAttrString(sys, "stdin", pystdin))
{
    /*show error*/
}
PyObject* pystderr = PyObject_CallMethod(io, "open", "ss", "CONOUT$", "w");
if (pystderr == NULL)
{
    /*show error*/
}
if (-1 == PyObject_SetAttrString(sys, "stderr", pystderr))
{
    /*show error*/
}
Py_DECREF(io);
Py_DECREF(sys);
Py_DECREF(pystdout);
Py_DECREF(pystdin);