为什么可以';t Python是否查找sys.path目录中的共享对象?

为什么可以';t Python是否查找sys.path目录中的共享对象?,python,shared-libraries,libcurl,pycurl,Python,Shared Libraries,Libcurl,Pycurl,我正在尝试导入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 任何帮助都将不胜感激。sys.path仅搜索Python模块。对于动态链接

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

任何帮助都将不胜感激。

sys.path
仅搜索Python模块。对于动态链接库,搜索的路径必须位于
LD\u LIBRARY\u PATH
中。检查您的
LD\u LIBRARY\u路径
是否包含
/usr/local/lib
,如果不包含,请添加它并重试

更多信息():

在Linux中,环境变量 LD_LIBRARY_路径是以冒号分隔的 库所在的目录集 应该先搜索,然后再搜索 标准目录集;这 在调试新库时非常有用 或者使用非标准库 特殊目的。环境 共享变量LD_预加载列表 具有重写的函数的库 标准集,正如 /etc/ld.so.preload确实如此。这些是 由加载器实现 /lib/ld-linux.so。我应该注意到,, 而LD_LIBRARY_PATH在许多方面都有效 类似于Unix的系统,它不能在 全部的例如,此功能 在HP-UX上提供,但作为 环境变量SHLIB_PATH,以及 在AIX上,此功能是通过 变量LIBPATH(具有相同的 语法,以冒号分隔的列表)

更新:要设置
LD\u库路径
,最好在
~/.bashrc
或同等文件:

export LD_LIBRARY_PATH=/usr/local/lib


如果第一个表单为空(相当于空字符串,或者根本不存在),则使用第二个表单(如果不存在)。请注意export的使用。

确保libcurl.so模块位于系统库路径中,该路径与python库路径不同且独立

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

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

该命令将运行缓存实用程序,但也将创建加载程序系统运行所需的所有必要“符号链接”。令人惊讶的是,libcurl的“makeinstall”并没有做到这一点,但如果/usr/local/lib不在/etc/ld.so.conf中,则可能无法做到这一点

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

小心点。弄错了会把你的系统搞砸


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

在编译pycurl时,还可以在用户环境中将LD_run_PATH设置为/usr/local/lib。这将在C扩展模块的RPATH属性中嵌入/usr/local/lib,这样它就可以在运行时自动知道在哪里找到库,而不必在运行时设置LD_library_路径。

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

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

我还是犯了同样的错误!杜夫


但是运行ldconfig为我建立了链接,这很有效。根本不需要设置LD_运行路径或LD_库路径。只是需要运行ldconfig。

作为上述答案的补充-我只是碰到了一个类似的问题,并且完全使用默认安装的python

当我调用我正在使用
LD\u library\u 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\u 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
。。。我立即得到一条更有意义的错误消息——关于缺少依赖项


我只是想把这记下来-干杯

我使用
python setup.py build\u ext-R/usr/local/lib-I/usr/local/include/libcalg-1.0
和编译后的文件,因此文件位于build文件夹下。
您可以键入
python setup.py--help build_ext
来查看关于-R和-I的解释,对于我来说,这里的工作就是使用一个版本管理器,例如,我强烈建议您对项目环境和包版本进行良好的管理,并将其与操作系统的版本分开


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

谢谢。我的LD_LIBRARY_PATH没有设置,所以:$LD_LIBRARY_PATH=/usr/local/lib$LD_LIBRARY_PATH/usr/local/lib,但我仍然得到相同的错误:$python-c“import pycurl”回溯(最近一次调用):File“”,第1行,在ImportError:libcurl.so.4:无法打开共享对象文件:没有此类文件或目录在设置LD_library_PATH变量后,我还必须授予用户读取库的权限。现在它终于起作用了。如果您没有正确设置
LD_LIBRARY_PATH
(我认为您的注释中缺少冒号),请查看我更新的答案。是否有一个名为libcurl.so.4的符号链接已断开?在我看来,它似乎正在查找文件,但无法打开它。如果所有其他方法都失败了,请搜索翻译并查找失败的呼叫。谢谢-这成功了。我想知道为什么我以前尝试的“快速修复”更改LD_LIBRARY_PATH变量没有成功。这取决于很多因素。这里有一个poss
$ 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=/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