3

我有一个用 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 加载工作?

4

1 回答 1

1

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

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

我会尝试编写一个适当的 Python(包装器)模块,而不是使用 ctypes 来导入 DLL。但是,我会同时做另一件事,那就是在 Python 用户邮件列表上询问此设置是否可以工作以及为什么。如果您愿意,还有一个新闻网关。

于 2013-01-25T19:36:35.523 回答