我正在使用Microsoft Visual Studio 2010中的C ++制作Windows GUI应用程序。我想要包含一个可以通过应用程序打开的Python调试控制台。我跟着this answer将C ++标准I / O连接到控制台,但是当我嵌入Python时,Python似乎无法通过其标准I / O访问控制台:
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;
但是,上面标有星号(*)的行不仅会导致运行时错误(错误消息不过是&#34; Microsoft Visual Studio C运行时库在[APP_NAME]中检测到致命错误.exe 。&#34;),但是Python的标准输入仍然不起作用,即使上面的输入块运行没有错误。
答案 0 :(得分:1)
您的程序需要使用与您尝试嵌入的Python版本相同的Microsoft C运行时DLL。 Python 2.7使用Visual Studio 2008编译,并在您使用Visual Studio 2010和MSVCRT90.DLL
时使用MSVCRT100.DLL
。每个DLL都拥有自己的stdin
,stdout
和stderr
,这就是为什么create_console
函数无效的原因。这两个DLL也有不同的FILE *
流内部布局,这就是当您将使用FILE *
创建的MSVCRT100.DLL
流传递给Python时崩溃的原因。它最终会尝试将其与MSVCRT90.DLL
一起使用。
基本上要解决此问题,您需要使用Visual Studio 2008编译应用程序。