【问题标题】:Loading and accessing multiple ctype instances加载和访问多个 ctype 实例
【发布时间】: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。
  • 检查(较新)stackoverflow.com/questions/54243176/…。该行为适用于 LnxWin 上的行为相同),因此我希望 OSX 上的行为也相同。

标签: python ctypes


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2020-01-08
      • 1970-01-01
      • 2016-03-23
      • 2016-02-15
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多