加载和访问多个 ctype 实例

Posted

技术标签:

【中文标题】加载和访问多个 ctype 实例【英文标题】:Loading and accessing multiple ctype instances 【发布时间】:2015-03-26 16:32:59 【问题描述】:

我有一些在 Python 中使用的现有 C 代码。我可以使用以下命令加载库:

library_path = '/full/path/to/my/library.dylib'
lib1 = cdll.LoadLibrary(library_path)

问题是我需要这个库的多个实例,例如:

lib2 = cdll.LoadLibrary(library_path)

这会创建第二个实例,但两者似乎具有相同的内存位置(句柄相同)。我尝试将 library.dylib 复制并重命名为 library1.dyliblibrary2.dylib,但这不会改变它们的加载方式。问题是当我调用 lib1 中的函数时,lib2 中的全局变量和状态变量会被修改。例如:

lib1.open('/path/to/myfile')  # open a file for processing
lib1.run()   # This will do something with the file

lib2.open('/path/to/anotherfile')  # open a file for processing
lib2.run()   # This will do something with the file

lib1.close() # Closes library 1

lib2.run()   # This fails because lib1.close() also closes lib2

有没有办法以保持“包含”的方式加载这些库实例?我尝试加载的 C 代码是非常大的遗留软件...我需要重写吗?

这是我发现解决类似问题的链接,但对我没有太大帮助:http://www.gossamer-threads.com/lists/python/python/826703

非常感谢任何帮助。

【问题讨论】:

如您所见,某些操作系统拒绝在同一进程中加载​​同一 DDL 的多个实例。如果一切都失败了,您可以使用multiprocessing 模块来分叉您的程序,并在不同的进程中加载​​每个 DLL。 检查(较新)***.com/questions/54243176/…。该行为适用于 LnxWin 上的行为相同),因此我希望 OSX 上的行为也相同。 【参考方案1】:

如您所见,某些操作系统拒绝在同一进程中加载​​同一 DDL 的多个实例。如果一切都失败了,您可以使用multiprocessing module 来分叉您的程序,并在不同的进程中加载​​每个 DLL。 – Sylvain Leroux 2015 年 1 月 27 日 22:20

【讨论】:

【参考方案2】:

对循环导入问题的回答可能(也可能不会)解决您的问题。

这是原帖:Circular Imports Hell

这是您可能会感兴趣的相关部分,最初由 Sebastian Wozny 发布:


开始摘录:

来自 David Beazley 的精彩演讲 Modules and Packages: Live and Let Die! - PyCon 2015, 1:54:00,这里有一种处理python循环导入的方法:

 try:
     from images.serializers import SimplifiedImageSerializer
 except ImportError:
     import sys
     SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer']

这会尝试导入 SimplifiedImageSerializer,如果引发 ImportError,因为它已经被导入,它会从 importcache 中拉取它。

节选结束:


我希望这会有所帮助。 -科学_1

【讨论】:

以上是关于加载和访问多个 ctype 实例的主要内容,如果未能解决你的问题,请参考以下文章

Python - ctypes - 如何调用函数和访问结构字段?

如何通过 Python 和 ctype 访问 C 全局变量结构

python 和 ctypes 访问具有嵌套结构的 c++ 类

在java中,为啥类实例也能访问静态域?

访问 .exe 导出函数时 Python ctypes 访问冲突

python3使用ctypes在windows中访问C和C++动态链接库函数示例