【问题标题】:Unhandled exception at multiarray.pyd the 2nd time the program runs程序第二次运行时 multiarray.pyd 未处理的异常
【发布时间】:2014-04-17 13:43:08
【问题描述】:

我正在用 c++ 制作一个 .dll 插件并将 python 2.7 嵌入其中。

在我导入一个大型程序之前,简单的 .py 程序一切正常。最奇怪的是程序第一次运行没有问题,但第二次抛出异常:

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

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

我在网上搜索过,有几个人有同样的错误,但对他们有用的解决方案不适合我。例如here

我知道这是一个非常具体的错误,但我希望有人已经设法克服它。 我不会在这里发布代码,因为我认为它与这个错误无关,也因为它太长了

编辑:我设法看到问题出在import numpy

【问题讨论】:

  • 您需要在调试器中运行它。该异常看起来程序正试图写入地址1(当然,这是非法的)。解决此问题的唯一方法是查看执行此操作的代码。

标签: python c++ python-c-api


【解决方案1】:

我设法解决了这个问题。似乎某些模块在多次调用其初始化例程时会出现问题,numpy 就是其中之一。解决方案是在程序最后只调用一次Py_Finalize()Py_Initialize() 可以调用任意多次,就像 Python 已经初始化一样,Py_Initialize() 是一个非操作...

此外,发现此解决方案使应用程序变得更快,因为 python 不需要在每次调用它的某些函数时重新启动。

更多信息here

【讨论】:

    【解决方案2】:

    pyHookpyxhook 库也会出现类似问题。花了很长时间找出这两个模块崩溃的原因,但网上没有任何线索。现在我发现numpy 也发生了这种情况。希望这一次Py_Finalize() 能解决我的两个问题。

    通过注释以下内容在我的嵌入式解释器代码中禁用 python 线程支持后,问题得到解决。顺便说一句,我已经在我的 C 代码创建的 POSIX 线程中运行解释器。

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

    现在我可以多次使用 numpy 和 pyHook 运行我的 py.script。但是,如果模块thread 是直接在python 脚本中导入或通过任何其他导入的模块导入,则会在C 代码末尾导致以下错误消息。

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

    我仍然觉得它需要一个更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多