142

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

任何帮助将不胜感激。

4

7 回答 7

172

sys.path仅搜索 Python 模块。对于动态链接库,搜索的路径必须在LD_LIBRARY_PATH. 检查您的LD_LIBRARY_PATHinclude/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

如果第一种形式为空(相当于空字符串,或根本不存在),则使用第一种形式,否则使用第二种形式。注意使用export

于 2009-07-08T19:12:33.003 回答
59

确保您的 libcurl.so 模块位于系统库路径中,该路径与 python 库路径不同且分开。

“快速修复”是将此路径添加到 LD_LIBRARY_PATH 变量。但是,设置系统范围(甚至帐户范围)是一个坏主意,因为它可能以这样一种方式设置,即某些程序会找到它不应该的库,或者更糟糕的是,会打开安全漏洞。

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

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

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

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

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

于 2009-07-08T20:13:10.557 回答
24

当您首先编译 pycurl 时,您还可以在您的用户环境中将 LD_RUN_PATH 设置为 /usr/local/lib。这会将 /usr/local/lib 嵌入到 C 扩展模块的 RPATH 属性中。所以它会自动知道在运行时在哪里可以找到库,而不必在运行时设置 LD_LIBRARY_PATH。

于 2009-07-10T12:17:02.383 回答
10

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

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

我仍然遇到同样的错误!德夫。

但是运行 ldconfig 为我建立了链接并且有效。根本不需要设置 LD_RUN_PATH 或 LD_LIBRARY_PATH。只需要运行 ldconfig。

于 2010-03-05T02:18:08.747 回答
9

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

...我立即收到一条更有意义的错误消息 - 关于缺少依赖项!

只是想我会在这里记下这个——干杯!

于 2012-06-11T19:26:55.703 回答
1

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

于 2016-04-22T10:16:21.047 回答
1

对我来说,这里的工作是使用pyenv 之类的版本管理器,我强烈建议您将项目环境和包版本很好地管理并与操作系统分开。

操作系统更新后我遇到了同样的错误,但很容易用pyenv install 3.7-dev(我使用的版本)修复。

于 2020-04-21T10:04:53.213 回答