python - 将嵌入式 Python IO 重定向到使用 AllocConsole 创建的控制台

标签 python console io-redirection

我在将 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();
}

如果我运行相同的东西但作为控制台应用程序(Visual Studio 05,BTW)并删除 AllocConsole 调用,一切正常。有人知道我错过了什么吗?

编辑:为了澄清起见,我正在寻找一种从 C API 执行此操作的方法。

另一个编辑:Alex 的解决方案是正确的,但对于使用 Python 3.x 的任何人,您可能会注意到新 API 中缺少 PyFile_FromString 函数。虽然它可能不是最佳选择,但我发现它在 Python 3.x 中运行良好:

PyObject* sys = PyImport_ImportModule("sys");
PyObject* io = PyImport_ImportModule("io");
PyObject* pystdout = PyObject_CallMethod(io, "open", "ss", "CONOUT$", "wt");
if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
    /* Announce your error to the world */
}
Py_DECREF(sys);
Py_DECREF(io);
Py_DECREF(pystdout);

最佳答案

在 Python 端设置 sys.stdout(大概是 open('CONOUT$', 'wt'))来生成 Python 的 print 工作,同样适用于 sys.stderrsys.stdin。 (有更快的方法可以从 C 扩展实现这一点,但最简单的方法是只执行 Python 语句,前面有一个 import sys;-)。

原因:因为 Python 的运行时在启动时发现标准 FD 已关闭,相应地设置 sys.stdout 和 friend ,并且不会再次检查并以不同方式设置它们 - 所以您只需设置他们自己,明确地,这会没事的。

如果您热衷于在 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:

sys.stdout = open('CONOUT$', 'wt')

关于python - 将嵌入式 Python IO 重定向到使用 AllocConsole 创建的控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698439/

相关文章:

python - 自定义索引 Python 数据结构

python - 如何用新名称替换特定标点符号?

python - Beautifulsoup 类内容错误连字符 "-"?

python - 在 Python 数据结构中有效地存储多个图像

Magento 中的 JavaScript 控制台日志

c# - 控制台暂停方式

javascript - 类型错误 : Illegal Invocation on console. log.apply

c# - 如何使用 asp.net C# 将命令提示符输出重定向到文件?

bash - 为什么 sed replace + redirect 删除了我的文件?

bash - 奇怪的 tput 行为,带有 stderr 重定向