如何将嵌入式Python连接到控制台';Windows GUI应用程序中的s I/O? 我在微软Visual Studio 2010中用C++制作了一个Windows GUI应用程序。我想包括一个可以通过应用程序打开的Python调试控制台。之后我将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

如何将嵌入式Python连接到控制台';Windows GUI应用程序中的s I/O? 我在微软Visual Studio 2010中用C++制作了一个Windows GUI应用程序。我想包括一个可以通过应用程序打开的Python调试控制台。之后我将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,python,c++,visual-studio-2010,python-2.7,Python,C++,Visual Studio 2010,Python 2.7,我尝试用以下方法修补此问题: 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_

我尝试用以下方法修补此问题:

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;
PyObject*py\u stdin=PyFile\u FromFile(stdin,“,”r“,NULL);
PySys_SetObject(“stdin”,py_stdin);
Py_DECREF(Py_stdin);py_stdin=NULL;
PyObject*py_stdout=PyFile_FromFile(stdout,“,“w”,NULL);//*
PySys_SetObject(“stdout”,py_stdout);
Py_DECREF(Py_stdout);py_stdout=NULL;
PyObject*py_stderr=PyFile_FromFile(stderr,“,“w”,NULL);//*
PySys_SetObject(“stderr”,py_stderr);
Py_DECREF(Py_stderr);py_stderr=NULL;

但不仅上面标有星号(*)的行会导致运行时错误(错误消息只不过是“Microsoft Visual Studio C运行时库在[APP_NAME].exe中检测到致命错误”),而且Python的标准输入仍然不起作用,即使上面的输入块运行时没有错误。

您的程序需要使用与您尝试嵌入的Python版本相同的Microsoft C运行时DLL。Python 2.7是使用Visual Studio 2008编译的,在使用Visual Studio 2010和
MSVCRT100.DLL时使用
MSVCRT90.DLL
。每个DLL都有自己的
stdin
stdout
stderr
,这就是为什么
create\u console
函数无效的原因。这两个DLL还具有不同的
文件*
流内部布局,这就是为什么将使用
MSVCRT100.DLL创建的
文件*
流传递给Python时,它会崩溃的原因。它最终尝试将其与
MSVCRT90.DLL
一起使用


基本上,要解决这个问题,您需要使用Visual Studio 2008编译您的应用程序。

您正在尝试嵌入哪个版本的Python?还有其他解决方法吗?或者,是否有可能获得一个使用
MSVCR100.DLL
的Python 2.7版本(甚至可以自己编译一个)?相反,这是否解决了我的问题:?是的,您可以使用Visual Studio 2010构建自己的Python 2.7版本。这里给出了其他可能的解决方法:这里给出的第一个解决方法在您的案例中不起作用。我还应该补充一点,这适用于您可能使用的任何第三方Python扩展模块。如果你重新编译Python,你将需要用VS2010重新编译它们。幸运的是,我不需要任何扩展(当然除了我自己的扩展)。无论如何,我链接到的构建包含很多第三方扩展。