Python可执行文件找不到libpython共享库

san*_*ans 133 python

我在CentOS 5上安装Python 2.7.我按如下方式构建并安装了Python

./configure --enable-shared --prefix=/usr/local
make
make install
Run Code Online (Sandbox Code Playgroud)

当我尝试运行/ usr/local/bin/python时,我收到此错误消息

/usr/local/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我在/ usr/local/bin/python上运行ldd时,我得到了

ldd /usr/local/bin/python
    libpython2.7.so.1.0 => not found
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e9a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e9200000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030fa200000)
    libm.so.6 => /lib64/libm.so.6 (0x00000030e9600000)
    libc.so.6 => /lib64/libc.so.6 (0x00000030e8e00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000030e8a00000)
Run Code Online (Sandbox Code Playgroud)

我如何告诉Python在哪里找到libpython?

Tam*_*más 198

请尝试以下方法:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)

如果不在,则替换/usr/local/lib为已安装的文件夹.libpython2.7.so.1.0/usr/local/lib

如果这样做并且您希望永久更改,您有两个选择:

  1. 添加export LD_LIBRARY_PATH=/usr/local/lib到您.profile的主目录中(仅当您使用的shell在启动新的shell实例时加载此文件时才有效).此设置仅对您的用户有效.

  2. 添加/usr/local/lib/etc/ld.so.conf和运行ldconfig.当然,这是一个系统范围的设置.

  • 对于任何尝试此操作的人来说只是一个注释:它只是"/ usr/local/lib",而不是原始的"include ld.so.conf.d/*.conf"的起始"include". (10认同)

Foo*_*osh 74

戴上我的掘墓帽......

我发现解决这个问题的最好方法是在编译时.既然你是一个设置前缀,那么也可以明确告诉可执行文件在哪里找到它的共享库.与OpenSSL和其他软件包不同,Python没有为您提供良好的配置指令来处理备用库路径(并不是每个人都是root你知道的......)在最简单的情况下,您只需要以下内容:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-Wl,--rpath=/usr/local/lib"
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢非Linux版本:

./configure --enable-shared \
            --prefix=/usr/local \
            LDFLAGS="-R/usr/local/lib"
Run Code Online (Sandbox Code Playgroud)

" rpath"标志告诉python它在该特定路径中具有所需的运行时库.您可以进一步采用这种想法来处理安装到与标准系统位置不同的位置的依赖关系.例如,在我的系统上,因为我没有root访问权限,需要进行几乎完全自包含的Python安装,我的配置行看起来像这样:

./configure --enable-shared \
            --with-system-ffi \
            --with-system-expat \
            --enable-unicode=ucs4 \
            --prefix=/apps/python-${PYTHON_VERSION} \
            LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \
            CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在编译Python使用(如图书馆ffi,readline等)到extlib蟒蛇目录树本身的目录.通过这种方式,我可以对python - $ {PYTHON_VERSION}目录进行tar操作并将其置于任何位置并且它将"正常工作"(前提是您没有遇到libclibm发生冲突).当尝试在同一个盒子上运行多个版本的Python时,这也有帮助,因为您不需要不断更改LD_LIBRARY_PATH或担心选择错误版本的Python库.

编辑:忘了提,如果你没有将PYTHONPATH环境变量设置为你用作你的前缀并且无法编译一些模块,编译会抱怨,例如,扩展上面的例子,设置PYTHONPATH为上面使用的前缀例子export PYTHONPATH=/apps/python-${PYTHON_VERSION}......


Ome*_*gan 20

我有同样的问题,我这样解决了:

如果你知道libpython所在的位置,我认为它就是/usr/local/lib/libpython2.7.so.1.0你的情况,你可以创建一个符号链接:

sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0
Run Code Online (Sandbox Code Playgroud)

然后尝试ldd再次运行,看看它是否有效.

  • 在做了'ldconfig'之后为我工作了 (8认同)

Nag*_*gev 6

我在CentOS 7最低版本上按软件集合安装了Python 3.5 。一切运行正常,但是当我尝试运行简单的CGI脚本时,我看到了此问题中提到的共享库错误:

tail /var/log/httpd/error_log
AH01215: /opt/rh/rh-python35/root/usr/bin/python: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我想要一个适用于所有用户的系统范围内的永久解决方案,从而避免在.profile或.bashrc文件中添加导出语句。有一个基于Red Hat解决方案页面的单行解决方案。感谢您指出的评论:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh
Run Code Online (Sandbox Code Playgroud)

重新启动后,在Shell上一切正常,但有时我的Web服务器仍然抱怨。还有另一种方法始终适用于外壳程序和服务器,并且更为通用。我在这里看到了解决方案,然后意识到它实际上也在这里的答案之一中提到了!无论如何,在CentOS 7上,这些步骤是:

 vim /etc/ld.so.conf
Run Code Online (Sandbox Code Playgroud)

我机器上的哪个刚刚有:

include ld.so.conf.d/*.conf
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个新文件:

vim /etc/ld.so.conf.d/rh-python35.conf
Run Code Online (Sandbox Code Playgroud)

并添加:

/opt/rh/rh-python35/root/usr/lib64/
Run Code Online (Sandbox Code Playgroud)

并手动重建缓存:

sudo ldconfig
Run Code Online (Sandbox Code Playgroud)

就是这样,脚本可以正常工作!

这是一个临时解决方案,不适用于重新启动:

sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v
Run Code Online (Sandbox Code Playgroud)

-v(详细)选项只是为了查看发生了什么。我看到它确实做到了:/ opt / rh / rh-python35 / root / usr / lib64:libpython3.so.rh-python35-> libpython3.so.rh-python35 libpython3.5m.so.rh-python35-1.0-> libpython3.5m.so.rh-python35-1.0

这个特殊的错误消失了。顺便说一句,chown在那之后,我不得不让用户去摆脱权限错误。

请注意,我使用find来查找库的目录。您也可以这样做:

sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0
Run Code Online (Sandbox Code Playgroud)

我的VM上哪个返回:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
Run Code Online (Sandbox Code Playgroud)

如上所示,这是我需要给ldconfig的路径。