如何在Windows GUI应用中将嵌入式Python连接到控制台的I/O?
我正在用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都有自己的一套stdin
、stdout
和stderr
,这就是为什么你的create_console
函数没有效果的原因。这两个DLL的FILE *
流的内部结构也不同,所以当你把用MSVCRT100.DLL
创建的FILE *
流传给Python时,它就会崩溃。因为它最终试图用MSVCRT90.DLL
来使用这个流。
简单来说,要解决这个问题,你需要用Visual Studio 2008来编译你的应用程序。