如何让Python加载正确的库(在OSX上是.dylib而不是.so.3)
我在使用 Python 2.7 的 extractor
模块,通过 pip install extractor
安装的。我是在 OS X 系统上,用 homebrew 来管理软件,之前我运行过 homebrew install libextractor
。这样会在 /usr/local/lib 目录下生成 .a 和 .dylib 后缀的文件。(这是 GNU 的 libextractor)
在 extractor.py 文件的第 36 行左右,有一段代码:
try: #loading shared object file libextractor = cdll.LoadLibrary('libextractor.so.3') except OSError: libextractor = cdll.extractor
当我在 Python 的命令行中尝试 import extractor
时,出现了 OSError: dlopen(extractor, 6): image not found
的错误。
这个错误似乎是因为我没有 .so.3 文件,而这个文件在模块中是硬编码的。不过,错误是从 except 块中出现的,而不是 try 块。
这个错误是因为 libextractor.so.3 被硬编码了吗?如果是的话,我该怎么告诉 Python 去加载正确的库呢?我尝试用各种存在的文件(.a 和 .dylib)替换那个值,但都没有成功。
2 个回答
如果这个方法有效,你应该使用 ctype.CDLL("libextractor"),让 ctypes 自动找出合适的扩展名。可惜的是,针对不同操作系统的扩展名处理并不完美。
ctypes
提供了一个 find_library
方法,如果这个方法能用,那就用它。不过可惜的是,它依赖一些外部程序,这意味着在运行时可能会有延迟,并且在一些小型或特殊的系统上可能会出问题。
其他项目已经根据 os.uname() 硬编码了扩展名,如果你必须这样做,也可以尝试。
附注:except 子句是一种奇怪的变通方法,实际上 ctypes.cdll.foo
等同于 ctypes.cdll.__getattr__("foo")
,而这又和 ctypes.CDLL("foo")
是一样的,但如果没有 lib-
或扩展名的话,这个方法是无法工作的。