将嵌入的Python IO重定向到使用allocons创建的控制台

2024-06-01 05:47:50 发布

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

将Python IO重定向到为Win32应用程序分配的控制台时遇到一些问题。我需要重定向特定于Python的流吗?在

以下是我现在正在做的事情(删除错误检查等):

int __stdcall WinMain(/*Usual stuff here*/) {
    // Create the console
    AllocConsole();
    SetConsoleTitle(L"My Console");

    // Redirect Standard IO Streams to the new console
    freopen("CONOUT$","w",stdout);
    freopen("CONOUT$","w",stderr);
    freopen("CONIN$","r",stdin);

    // Test the console:
    printf("This Works.\r\n");
    cout << "So Does this" << endl;

    // Python Stuff (This is where it fails)
    Py_Initialize();
    PyRun_SimpleString("print('I don't work.')\n");
    Py_Finalize();
}

如果我以控制台应用程序(visualstudio05,BTW)运行相同的东西并删除alloconsole调用一切正常。有人知道我错过了什么吗?在

编辑:为了澄清一下,我正在寻找一种从C API实现的方法。在

另一个编辑:Alex的解决方案是正确的,但是对于任何使用python3.x的人来说,您可能会注意到新API中缺少PyFile_FromString函数。虽然这可能不是最好的替代方案,但我发现在Python 3.x中这一点很好:

^{pr2}$

Tags: thepyioapi应用程序编辑错误this
2条回答

类似地,{cd4}和{cd4}{cd4}都是为了让Python{cd3}工作。(通过C扩展有更快的方法来实现这一点,但最简单的方法是只执行Python语句,前面加一个import sys;-)。在

原因:因为Python的运行时在启动时发现标准FDs是关闭的,相应地设置sys.stdout和friends,并且不会再次检查和设置它们,所以您只需自己显式地设置它们,就可以了。在

如果您热衷于在C-API级别完成所有这些,则需要几行代码,但当然可以做到。。。在

PyObject* sys = PyImport_ImportModule("sys");
PyObject* pystdout = PyFile_FromString("CONOUT$", "wt");
if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
  /* raise errors and wail very loud */
}
Py_DECREF(sys);
Py_DECREF(pystdout);

这完全等同于一个Python行:

^{pr2}$

只需告诉嵌入的python将其输出重定向到一个文件就容易得多。在

请尝试以下代码:

PyRun_SimpleString("import sys\n");
PyRun_SimpleString( "sys.stdout = sys.stderr = open(\"C:\\embedded_log_file.txt\", \"w\")\n" );

相关问题 更多 >