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

2024-04-19 18:52:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道也有类似的问题,但我解决这个问题的努力没有成功。我想重定向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);

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

^{pr2}$

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

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

我只有

Hello

我很感激使用Python和API来解决它。 谢谢。在


Tags: pyifstdinstdoutsys重定向raisepyobject
1条回答
网友
1楼 · 发布于 2024-04-19 18:52:19

我已经找到了解决方案,只做了一些改动,使用了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);

相关问题 更多 >