PyThreadState_GET()从PyImport_GetModuleDict()中返回NULL

时间:2017-08-08 03:28:49

标签: python c++ c windows python-3.x

我正在使用Python 3.6开发Windows。我有以下死的简单嵌入代码,我用它来测试python解释器:

Py_SetProgramName(L"MyApp");

Py_SetPath(
    L"C:\\Users\\rutski\\Documents\\python\\PCBuild\\amd64\\python36.zip;"
    L"C:\\Users\\rutski\\Documents\\python\\DLLs;"
    L"C:\\Users\\rutski\\Documents\\python\\lib;"
    L"C:\\Users\\rutski\\Documents\\python\\PCBuild\\amd64;"
    L"C:\\Users\\rutski\\Documents\\python;"
    L"C:\\Users\\rutski\\Documents\\python\\lib\\site-packages");

Py_Initialize();

PyRun_SimpleString(
    "from time import time,ctime\n"
    "print('Today is', ctime(time()))\n");

此代码崩溃尝试从PyRun_SimpleString()中访问地址0x00000010。事件的顺序如下:

  1. PyRun_SimpleString()执行AddModule(“__ main __”)

  2. AddModule执行PyImport_GetModuleDict()

  3. PyImport_GetModuleDict()尝试doPyThreadState_GET() - > interp

  4. PyThreadState_GET()返回NULL,因此 - > interp部分崩溃。

  5. 奇怪的是,从我的应用程序中直接调用PyImport_GetModuleDict()可以正常工作。如果我用main()中的嵌入代码构建一个Windows命令行应用程序,并且从终端执行它,那么Weirder仍然是整个事情实际上执行得很好。只有在构建Windows GUI应用程序并在WinMain()中调用嵌入代码时才会发生崩溃。

    这是一个python解释器,我使用PCbuild \ build.bat从Windows上的源码构建,以便我可以跟踪崩溃。然而,我使用PCbuild \ build.bat从Windows上的源代码构建的python windows installer.er提供的库存解释器发生了完全相同的崩溃,因此我可以跟踪崩溃。但是,python windows安装程序提供的库存解释器发生了完全相同的崩溃。

    相关帖子似乎在这里:Embedding Python, works in main() but not in WinMain()

    虽然该线程尚未解决,但无论如何它并没有以完全相同的方式崩溃。也许这只是因为他们在3.4而我在3.6。也许潜在的问题是一样的。

1 个答案:

答案 0 :(得分:1)

在黑暗中磕磕绊绊之后我得到了答案。下表显示了我使用不同的python库对我的WinMain()应用程序的不同构建配置进行配对的测试结果。术语“发布”和“调试”是指Visual Studio中的配置类型。所有构建都在x64模式下完成。

Debug   | python36.lib   | Works
Debug   | python36_d.lib | Works
Debug   | python3_d.lib  | Works
Debug   | python3.lib    | !!! CRASHES !!!
Release | python36.lib   | Works
Release | python36_d.lib | Works
Release | python3_d.lib  | !!! CRASHES !!!
Release | python3.lib    | Works

所以,似乎选择一个不匹配的python二进制文件会导致崩溃,但只有python3,而不是python36 。这让我想知道两者之间的差异是什么。我开始崩溃是因为我将我的Debug版本与发布版本python3.lib相关联,因为我觉得它应该没关系。

我的问题现在已经解决了,但是如果有人能够详细说明为什么会发生这种情况,那么我肯定会感兴趣。