为什么Python不能findsys.path中的目录中的共享对象?

我正在尝试导入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'] 

任何帮助将不胜感激。

sys.path只searchPython模块。 对于dynamic链接库,search的path必须位于LD_LIBRARY_PATH 。 检查您的LD_LIBRARY_PATH包含/usr/local/lib ,如果不包含,请将其添加并重试。

更多信息( 来源 ):

在Linux中,环境variablesLD_LIBRARY_PATH是一组以冒号分隔的目录,在标准目录集之前首先search库; 这在debugging新的库或使用非标准库用于特殊用途时非常有用。 环境variablesLD_PRELOAD列出了具有覆盖标准集的函数的共享库,就像/etc/ld.so.preload一样。 这些通过loader /lib/ld-linux.so来实现。 我应该注意到,虽然LD_LIBRARY_PATH可以在很多类Unix系统上工作,但是它并不能工作。 例如,此function在HP-UX上可用,但是作为环境variablesSHLIB_PATH,在AIX上,此function通过variablesLIBPATH(使用相同的语法,以冒号分隔的列表)提供。

更新:要设置LD_LIBRARY_PATH ,理想情况下在~/.bashrc或等效文件中使用下列之一:

 export LD_LIBRARY_PATH=/usr/local/lib 

要么

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

如果它是空的(相当于空string,或根本不存在),则使用第一种forms;如果不是,则使用第二种forms。 注意使用导出

确保您的libcurl.so模块位于系统库path中,该path与python库path截然不同。

“快速修复”是将此path添加到LD_LIBRARY_PATHvariables。 然而,设置系统范围(或甚至帐户范围)是一个糟糕的IDEA,因为它可能被设置为一些程序会find一个它不应该,甚至更糟糕的是,打开安全漏洞的方式。

如果您的“本地安装的库”安装在/ usr / local / lib目录中,请将此目录添加到/etc/ld.so.conf(这是一个文本文件)并运行“ldconfig”

该命令将运行caching实用程序,但也会创build加载程序系统运行所需的所有必需的“符号链接”。 令人惊讶的是,libcurl的“make install”并没有这样做,但如果/ usr / local / lib已经不在/etc/ld.so.conf中,则可能不行。

PS:你的/etc/ld.so.conf可能只包含“include ld.so.conf.d / *。conf”。 您仍然可以在其后添加一个目录path,或者只是在它所包含的目录中创build一个新文件。 之后不要忘了运行“ldconfig”。

小心。 弄错这个可能会搞砸你的系统。

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

当你首先编译pycurl时,你也可以在你的用户环境中将LD_RUN_PATH设置为/ usr / local / lib。 这会将/ usr / local / libembedded到C扩展模块.so的RPATH属性中,以便在运行时自动知道在哪里find库,而不必在运行时设置LD_LIBRARY_PATH。

有完全相同的问题。 我将curl 7.19安装到/ opt / curl /以确保我不会影响我们的生产服务器上的当前curl。 一旦我将libcurl.so.4链接到/ usr / lib:

sudo ln -s /opt/curl/lib/libcurl.so /usr/lib/libcurl.so.4

我仍然有同样的错误! Durf。

但运行ldconfig使我的联系和工作。 根本不需要设置LD_RUN_PATH或LD_LIBRARY_PATH。 只需要运行ldconfig。

作为上述答案的补充 – 我只是碰到类似的问题,并完全使用默认安装的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 

…我立即得到一个更有意义的错误消息 – 关于一个缺less的依赖!

只是以为我会记下这里 – 欢呼!

我使用python setup.py build_ext -R/usr/local/lib -I/usr/local/include/libcalg-1.0编译的.so文件位于build文件夹下。 你可以inputpython setup.py --help build_ext来查看-R和-I的解释