【问题标题】:How to get python to load right library (a .dylib, not .so.3 on OSX)如何让 python 加载正确的库(一个 .dylib,而不是 OSX 上的 .so.3)
【发布时间】:2014-03-18 15:28:16
【问题描述】:

我通过pip install extractor 在python 2.7 中使用extractor 模块。我在 OS X 上使用自制软件,之前运行过 homebrew install libextractor。这会在 /usr/local/lib 中创建扩展名为 .a 和 .dylib 的文件。 (GNU libextractor)

extractor.py 的第 36 行左右,有这样的代码:

尝试: #加载共享对象文件 libextractor = cdll.LoadLibrary('libextractor.so.3') 除了 OSError: libextractor = cdll.extractor

我在尝试从 python shell 发送import extractor 时收到OSError: dlopen(extractor, 6): image not found

这似乎是因为我没有 .so.3 文件,并且在模块中进行了硬编码。但是错误来自于 except 块,而不是 try 块。

这个错误是由于 libextractor.so.3 的硬编码造成的,如果是这样,我如何告诉 python 加载正确的库?我尝试用确实存在的各种文件(.a、.dylib)替换该值,但没有成功。

【问题讨论】:

    标签: python macos homebrew extractor


    【解决方案1】:

    如果它有效,您应该使用 ctype.CDLL("libextractor") 并让 ctypes 找出正确的扩展名。遗憾的是,不存在特定于操作系统的扩展魔法。

    ctypes 提供find_library 方法,如果可行,请使用它。遗憾的是,它依赖于外部程序,这意味着在小型或奇怪的系统上运行时会受到影响和损坏。

    other projects went ahead and hardcoded extension 基于 os.uname()。如果需要,请这样做。

    附: except 子句是一些奇怪的解决方法,实际上ctypes.cdll.foo 等同于ctypes.cdll.__getattr__("foo"),它与ctypes.CDLL("foo") 相同,如果没有lib- 或扩展名,它就无法工作。

    【讨论】:

    • 通过直接进入 python shell,我尝试了 import ctypes,然后是 ctypes.CDLL("libextractor") - 现在它是一个不同的错误,说没有找到合适的图像。确实找到了:/usr/local/lib/libextractor:不是文件。
    • 更好地链接到基于操作系统类型的文件名检测:svn.python.org/projects/python/branches/pep-0384/Lib/ctypes/…
    • /usr/local/lib/libextractor 是指向 /usr/local/Cellar/libextractor/1.3/lib/libextractor(一个目录)的符号链接,其中包含许多 .so 和 .a
    【解决方案2】:

    【讨论】:

    • 我已经通过 brew 安装了 libextractor-1.3;这很成功,并且二进制提取程序似乎按预期运行。对于 OSX,您链接的说明基本上只是说运行 ./configure;制作; make install,我相信 brew 已经做到了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多