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

标签 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 加载正常工作?

最佳答案

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

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

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

关于c++ - Python 调用 DLL 调用 Python, "WindowsError: exception: access violation reading 0x00000004",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527490/

相关文章:

c++ - typedef 智能指针是不好的做法吗?

python - 将 Flask AutoIndex 绑定(bind)到 http ://localhost? 以外的其他 URL

python - 如何自定义 Python ctypes 'c_wchar_p' 和 'c_char_p' restype?

python - Python中如何进行C语言计算

c++ - 在 C++11 中实现自定义迭代器

c++ - 命名空间嵌套函数的最佳实践和语义以及extern "C"的使用

C++ `using` 模板类中类型别名的命令

python - 在 python 中使用名称列表打开多个文件

javascript - 将纯文本呈现为 HTML 维护空白——没有 <pre>

python - ctypes 中的 find_library()