Python调用DLL调用Python,“WindowsError:exception:access violation reading 0x00000004”

时间:2013-01-25 17:49:59

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

我有一个用Python编写的应用程序。

应用程序调用dll中的一些函数(使用ctypes),这些函数从python C API调用一些函数来加载和运行(不同的)python模块中的一些函数。这会导致WindowsError: exception: access violation reading 0x00000004一些cout调试告诉我,在调用Python C API时会发生访问冲突。

我知道DLL成功加载了python模块,当我将它作为一个独立的.exe进行测试时运行完成但是当它从python应用程序运行时它会给出这个访问冲突错误。

首先,我可能应该在DLL中使用Py_NewInterpreter为这些python模块函数创建一个新的独立空间来运行。这似乎很方便,因为不需要应用程序,DLL运行的模块共享任何数据。 http://docs.python.org/2/c-api/init.html#Py_NewInterpreter

然而,我对Py_NewInterpreter的初步测试证明仅仅是进一步的错误和崩溃是不成功的。

所以我的问题是我应该如何实现这个/我需要做什么才能使python模块的DLL加载工作?

1 个答案:

答案 0 :(得分:1)

这看起来像是取消引用一个空指针,即一个指向结构/类的指针为null,你正在读取偏移量为4的子对象。在你的代码中撒一些assert()以确保你不会错过任何一个空指针。另请注意,如果出现异常,Python C API会定期返回null。

那就是说,你有一个Python程序通过ctypes导入DLL。这个DLL反过来通过Python的C API嵌入Python解释器。对?如果我没有弄错的话,那么在一个过程中有效地为你提供了两个解释器实例。问题在于,两者之间共享任何全局对象,并且这可能无法协调。

我要尝试的是编写一个合适的Python(包装器)模块,而不是使用ctypes来导入DLL。但是,还有另一件事我会并行做,那就是在Python用户邮件列表中询问,这个设置是否有效以及原因。如果您愿意,还有一个新闻网关。