如何在Windows GUI应用中将嵌入式Python连接到控制台的I/O?

1 投票
1 回答
834 浏览
提问于 2025-04-18 16:18

我正在用C++在Microsoft Visual Studio 2010里制作一个Windows图形界面应用程序。我想在这个应用里加入一个可以打开的Python调试控制台。我按照这个回答的方法,把C++的标准输入输出连接到控制台,但当我嵌入Python时,Python似乎无法通过它的标准输入输出访问这个控制台:

create_console(); // essentially the function in the answer I linked to above
Py_Initialize(); // initialize Python
printf("hello, world\n"); // works
PyRun_SimpleString("print \"hello, world\""); // does not work

我尝试用以下方法来修复这个问题:

PyObject *py_stdin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
PySys_SetObject("stdin", py_stdin);
Py_DECREF(py_stdin); py_stdin = NULL;

PyObject *py_stdout = PyFile_FromFile(stdout, "<stdout>", "w", NULL); // *
PySys_SetObject("stdout", py_stdout);
Py_DECREF(py_stdout); py_stdout = NULL;

PyObject *py_stderr = PyFile_FromFile(stderr, "<stderr>", "w", NULL); // *
PySys_SetObject("stderr", py_stderr);
Py_DECREF(py_stderr); py_stderr = NULL;

但是,上面用星号(*)标记的那些行不仅导致了运行时错误(错误信息只是“Microsoft Visual Studio C运行时库检测到[APP_NAME].exe中的致命错误。”),而且Python的标准输入依然无法使用,尽管上面的输入代码块运行时没有错误。

1 个回答

1

你的程序需要使用和你想要嵌入的Python版本相同的Microsoft C运行时DLL。Python 2.7是用Visual Studio 2008编译的,使用的是MSVCRT90.DLL,而你现在用的是Visual Studio 2010和MSVCRT100.DLL。每个DLL都有自己的一套stdinstdoutstderr,这就是为什么你的create_console函数没有效果的原因。这两个DLL的FILE *流的内部结构也不同,所以当你把用MSVCRT100.DLL创建的FILE *流传给Python时,它就会崩溃。因为它最终试图用MSVCRT90.DLL来使用这个流。

简单来说,要解决这个问题,你需要用Visual Studio 2008来编译你的应用程序。

撰写回答