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

将嵌入式Python IO重定向到使用AllocConsole Win32应用程序创建的控制台,python,redirect,python-c-api,python-c-extension,Python,Redirect,Python C Api,Python C Extension,我知道也有类似的问题,但我解决这个问题的努力没有成功。我想重定向Python解释器I/O,但我只成功地重定向了标准输出。我仍然对stdin和stderr有问题。基于此,我做了以下工作: PyObject* sys = PyImport_ImportModule("sys"); PyObject* pystdout = PyFile_FromString("CONOUT$", "wt"); if (-1 == PyObject_SetAt

我知道也有类似的问题,但我解决这个问题的努力没有成功。我想重定向Python解释器I/O,但我只成功地重定向了标准输出。我仍然对stdin和stderr有问题。基于此,我做了以下工作:

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);
执行脚本时,控制台上只显示第一次打印。第二个和第三个命令根本不显示。因此,不是输出:

Hello
Take a guess: "my guess"
"my guess"
我只有

Hello
如果有任何帮助,我将不胜感激,需要使用Python C API解决。
谢谢。

我已经找到了解决方案,只做了一些改动,并使用了Python3.x而不是2.x。现在,如果我们根据Python3.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);
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);