【发布时间】: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。
-
检查(较新)stackoverflow.com/questions/54243176/…。该行为适用于 Lnx(Win 上的行为相同),因此我希望 OSX 上的行为也相同。