加载和访问多个ctype实例

时间:2015-01-27 22:12:00

标签: python ctypes

我有一些我在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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您已经注意到,某些操作系统拒绝在同一进程中加载​​同一DDL的多个实例。如果其他所有操作均失败,则可以使用multiprocessing module来分叉程序,并在不同的进程中加载​​每个DLL。 –西尔文·勒鲁(Sylvain Leroux),2015年1月27日,22:20

答案 1 :(得分:0)

回答有关循环进口问题的答案可能会(或可能不会)解决您的问题。

以下是原始主题:Circular Imports Hell

这是您可能会发现有趣的相关部分,最初由塞巴斯蒂安·沃兹尼(Sebastian Wozny)发布:


摘录:

David Beazleys的精彩演讲模块和软件包: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中将其拉出。

摘录


我希望这会有所帮助。 -Science_1