程序第二次运行时在multiarray.pyd处未处理的异常

1 投票
2 回答
1927 浏览
提问于 2025-04-18 03:07

我正在用C++制作一个.dll插件,并把Python 2.7嵌入其中。

在处理简单的.py程序时,一切都很顺利,但当我导入一个较大的程序时,情况就变得奇怪了。最奇怪的是,这个程序第一次运行没问题,但第二次就出现了异常:

Unhandled exception at 0x6731ADA1 (multiarray.pyd) in EuroScope.exe: 0xC0000005: Access violation writing location 0x00000001.

(Lib/Dll文件夹和模块都已经复制到.exe文件夹里)

我在网上查了一下,发现有几个人遇到过同样的错误,但对他们有效的解决办法对我却不管用。例如,在这里

我知道这是一个非常具体的错误,但我希望能找到已经解决这个问题的人。我不打算在这里贴代码,因为我觉得这和这个bug无关,而且代码太长了。

编辑:我发现问题特别出在import numpy这行。

2 个回答

0

类似的问题也出现在 pyHookpyxhook 这两个库上。我花了很长时间想搞清楚这两个模块崩溃的原因,但网上没有找到相关的信息。现在我发现 numpy 也出现了同样的问题。我希望这次调用 Py_Finalize() 能解决我两个问题。

我通过注释掉以下代码,禁用了我嵌入式解释器中的 Python 线程支持,问题就解决了。顺便说一下,我的解释器已经在我 C 代码创建的 POSIX 线程中运行。

//PyEval_InitThreads();
//gstate = PyGILState_Ensure();
//PyGILState_Release(gstate);

现在我可以多次运行带有 numpy 和 pyHook 的 Python 脚本了。不过,如果在 Python 脚本中直接导入了 thread 模块,或者通过其他导入的模块导入它,C 代码的最后会出现以下错误信息。

Exception KeyError: KeyError(14288,) in <module 'threading' from 'C:\python27\Lib\threading.pyc'> ignored

不过我还是觉得需要一个更好的解决办法。

4

我解决了这个问题。看起来有些模块在初始化的时候,如果被调用超过一次,就会出现问题,而numpy就是其中之一。解决办法是只在程序的最后一次调用Py_Finalize()。至于Py_Initialize(),你可以随便调用很多次,因为如果Python已经初始化了,调用Py_Initialize()就不会有任何效果。

而且,我还发现这个解决方案让应用程序运行得更快,因为每次调用Python的某些功能时,它不需要重新启动。

更多信息可以在这里找到。

撰写回答