为什么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的解释