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

Python calling DLL calling Python, "WindowsError: exception: access violation reading 0x00000004"

本文关键字:Python 调用 violation reading 0x00000004 access WindowsError DLL exception      更新时间:2023-10-16

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

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

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

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