加载和访问多个ctype实例

24

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

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
非常感谢任何帮助。

5
你可能已经注意到,一些操作系统拒绝在同一进程中加载多个相同的动态链接库。如果其他方法都失败了,你可以使用multiprocessing模块来分叉你的程序,并在不同的进程中加载每个DLL。 - Sylvain Leroux
1
请查看(更新)https://dev59.com/t7Hma4cB1Zd3GeqPHzIP#54257116。该行为适用于*Lnx*(在*Win*上具有相同的行为),因此我也希望在*OSX*上是相同的。 - CristiFati
2个回答

2
正如您所注意到的,一些操作系统拒绝在同一进程中加载多个相同的动态链接库。如果其他所有方法都失败了,您可以使用多进程模块来分叉程序,并在不同的进程中加载每个DLL。- Sylvain Leroux 2015年1月27日22:20

0

对于循环导入的问题所给出的答案可能(或可能不会)解决您的问题。

以下是原始线程:Circular Imports Hell

这是Sebastian Wozny最初发布的相关部分,您可能会发现它很有趣:


正文:

以下是来自 David Beazley 在 PyCon 2015 中的精彩演讲《模块和包:生死由命!》1:54:00 中,处理 Python 循环导入的方法:

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

这个代码尝试导入SimplifiedImageSerializer,如果出现ImportError错误,因为它已经被导入了,它将从importcache中提取。

摘录结束:


我希望这对你有所帮助。- Science_1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接