加载和访问多个 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.dylib 和 library2.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/…。该行为适用于 Lnx(Win 上的行为相同),因此我希望 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++ 类