为什么不能蟒蛇找到共享对象是在sys.path的目录?为什么不能蟒蛇找到共享对象是在sys.path

2019-05-31 22:23发布

我试图导入pycurl:

$ python -c "import pycurl"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory

现在,libcurl.so.4是在/ usr / local / lib目录。 正如你所看到的,这是在sys.path中:

$ python -c "import sys; print sys.path"
['', '/usr/local/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg', 
'/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', 
'/usr/local/lib/python2.5/plat-linux2', '/usr/local/lib/python2.5/lib-tk', 
'/usr/local/lib/python2.5/lib-dynload', 
'/usr/local/lib/python2.5/sitepackages', '/usr/local/lib', 
'/usr/local/lib/python2.5/site-packages']

任何帮助将不胜感激。

Answer 1:

sys.path只搜索Python模块。 对于动态链接库,路径搜索必须在LD_LIBRARY_PATH 。 检查您LD_LIBRARY_PATH包括/usr/local/lib ,如果没有,添加它,然后再试一次。

一些更多的信息( 源 ):

在Linux中,环境变量LD_LIBRARY_PATH是一个冒号分隔的组,其中库应该被搜索的第一,标准组目录之前的目录; 这个调试新库或使用非标准库用于特殊用途时非常有用。 环境变量LD_PRELOAD列出共享库与覆盖标准集,正如/etc/ld.so.preload一样的功能。 这些是由装载机/lib/ld-linux.so实现。 我要指出的是,虽然LD_LIBRARY_PATH工程对很多Unix类系统,它不是在所有的工作; 例如,该功能可以用HP-UX,但随着环境变量SHLIB_PATH,并在AIX此功能是通过可变LIBPATH(具有相同的句法,一个冒号分隔的列表)。

更新:设置LD_LIBRARY_PATH ,使用下列情况之一,最好在你~/.bashrc或相应文件:

export LD_LIBRARY_PATH=/usr/local/lib

要么

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

使用第一种形式,如果是空的(相当于空字符串,或不存在的话),第二个形式,如果事实并非如此。 注意使用出口



Answer 2:

确保您的libcurl.so模块在系统库路径,这是从Python库路径不同的独立。

A“速战速决”就是这个路径添加到LD_LIBRARY_PATH变量。 但是,设置该系统范围内(甚至占宽)是一个坏主意,因为它是可以设置它以这样一种方式,有些计划会找到一个图书馆它不应该,甚至更糟糕,开拓安全漏洞。

如果你的“本地安装库”安装在,例如,在/ usr / local / lib目录,添加这个目录到/etc/ld.so.conf中(这是一个文本文件),然后运行“ldconfig命令”

该命令将运行一个缓存工具,也将创建装载系统运作所需的所有必要的“符号链接”。 令人惊讶的是,“让安装”与libcurl不这样做了,但有可能它不能,如果在/ usr / local / lib目录不在/etc/ld.so.conf中了。

PS:这可能是你的/etc/ld.so.conf中只含有“包括ld.so.conf.d / *会议”。 您仍然可以添加一个目录路径后,或者只是创建目录里面它正在从包括一个新的文件。 不要忘记后,运行“ldconfig命令”。

小心。 得到这个错误可以搞砸了你的系统。

此外:请确保您的Python模块是针对该版本的libcurl编译。 如果你只是从另一个系统复制一些文件过来,这不会总是工作。 如果有疑问,编译系统上的模块,你打算上运行它们。



Answer 3:

当你在第一时间编译pycurl您还可以设置LD_RUN_PATH到/ usr / local / lib目录在您的用户环境。 这将在C扩展模块。所以,这样它会自动知道在哪里可以找到在运行时库,而无需有LD_LIBRARY_PATH设置在运行时的RPATH属性嵌入在/ usr / local / lib目录。



Answer 4:

有完全相同的问题。 我安装卷曲7.19到/ opt /卷曲/以确保我不会影响我们的生产服务器当前的卷曲。 有一次,我挂libcurl.so.4到/ usr / lib目录下:

须藤LN -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4

我还是得到了同样的错误! Durf。

但运行使LDCONFIG联动为我和起作用的。 无需设置LD_RUN_PATH或LD_LIBRARY_PATH的。 只需要运行ldconfig。



Answer 5:

作为补充,以上答案 - 我只是碰到了类似的问题,完全是默认安装的Python的工作。

当我调用共享对象库我在寻找与的例子LD_LIBRARY_PATH ,我得到的是这样的:

$ LD_LIBRARY_PATH=/path/to/mysodir:$LD_LIBRARY_PATH python example-so-user.py
python: can't open file 'example-so-user.py': [Errno 2] No such file or directory

值得注意的是,它甚至不抱怨进口 - 它抱怨源文件!

但是,如果我强迫使用对象加载LD_PRELOAD

$ LD_PRELOAD=/path/to/mysodir/mypyobj.so python example-so-user.py
python: error while loading shared libraries: libtiff.so.5: cannot open shared object file: No such file or directory

......我立即得到一个更有意义的错误消息 - 关于丢失的依赖!

只是想我会记下来在这里 - 干杯!



Answer 6:

我用python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0和编译.so文件是生成文件夹之下。 您可以键入python setup.py --help build_ext看到-R和的解释-I



文章来源: Why can't Python find shared objects that are in directories in sys.path?