Python 可执行文件未找到 libpython 共享库
- 2025-03-18 08:54:00
- admin 原创
- 44
问题描述:
我在 CentOS 5 上安装 Python 2.7。我按如下方式构建并安装了 Python
./configure --enable-shared --prefix=/usr/local
make
make install
当我尝试运行 /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
当我在 /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)
我如何告诉 Python 在哪里找到 libpython?
解决方案 1:
请尝试以下操作:
LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python
如果不存在,请将其替换/usr/local/lib
为您安装的文件夹。libpython2.7.so.1.0
`/usr/local/lib`
如果此方法有效并且您想要使更改永久生效,则您有两个选择:
添加
export LD_LIBRARY_PATH=/usr/local/lib
到您的.profile
主目录中(这仅在您使用的 shell 在启动新 shell 实例时加载此文件时才有效)。此设置只会影响您的用户。添加并运行
/usr/local/lib
。这当然是系统范围的设置。/etc/ld.so.conf
`ldconfig`
解决方案 2:
戴上我的掘墓人帽子......
我发现解决这个问题的最佳方法是在编译时。既然你无论如何都要设置前缀,那么不妨明确告诉可执行文件在哪里找到它的共享库。与 OpenSSL 和其他软件包不同,Python 不会给你很好的配置指令来处理备用库路径(你知道不是每个人都是 root...)在最简单的情况下,你只需要以下内容:
./configure --enable-shared \n --prefix=/usr/local \n LDFLAGS="-Wl,--rpath=/usr/local/lib"
或者如果您更喜欢非 Linux 版本:
./configure --enable-shared \n --prefix=/usr/local \n LDFLAGS="-R/usr/local/lib"
“ rpath
”标志告诉 Python,它在该特定路径中具有所需的运行时库。您可以进一步利用这个想法来处理安装到与标准系统位置不同的位置的依赖项。例如,在我的系统上,由于我没有 root 访问权限,并且需要进行几乎完全独立的 Python 安装,因此我的配置行如下所示:
./configure --enable-shared \n --with-system-ffi \n --with-system-expat \n --enable-unicode=ucs4 \n --prefix=/apps/python-${PYTHON_VERSION} \n LDFLAGS="-L/apps/python-${PYTHON_VERSION}/extlib/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/lib -Wl,--rpath=/apps/python-${PYTHON_VERSION}/extlib/lib" \n CPPFLAGS="-I/apps/python-${PYTHON_VERSION}/extlib/include"
在这种情况下,我将 Python 使用的库(如、等)编译ffi
到readline
Pythonextlib
目录树本身的目录中。这样,我可以将 python-${PYTHON_VERSION} 目录打包并放到任何地方,它都会“工作”(前提是您不会遇到libc
或libm
冲突)。这在尝试在同一台机器上运行多个版本的 Python 时也会有所帮助,因为您不需要不断更改LD_LIBRARY_PATH
或担心选择错误版本的 Python 库。
编辑:忘了提及,如果您没有将PYTHONPATH
环境变量设置为用作前缀的内容并且无法编译某些模块,则编译将会抱怨,例如,为了扩展上述示例,请将其设置PYTHONPATH
为上述示例中使用的前缀export PYTHONPATH=/apps/python-${PYTHON_VERSION}
...
解决方案 3:
我遇到了同样的问题,并通过以下方式解决了:
如果你知道 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
然后尝试ldd
再次运行并查看是否有效。
解决方案 4:
我在 CentOS 7 minimal 上安装了Software Collections的 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
我想要一个适用于所有用户的系统范围的永久解决方案,这样就无需向 .profile 或 .bashrc 文件添加导出语句。有一个基于Red Hat 解决方案页面的单行解决方案。感谢您指出这一点的评论:
echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh
重启后,shell 上一切正常,但有时我的 Web 服务器仍然会抱怨。还有另一种方法,它始终适用于 shell 和服务器,并且更通用。我在这里看到了解决方案,然后意识到它实际上也在这里的一个答案中提到过!无论如何,在 CentOS 7 上,这些是步骤:
vim /etc/ld.so.conf
我的机器上刚刚有:
include ld.so.conf.d/*.conf
所以我创建了一个新文件:
vim /etc/ld.so.conf.d/rh-python35.conf
并补充道:
/opt/rh/rh-python35/root/usr/lib64/
并手动重建缓存:
sudo ldconfig
就是这样,脚本运行良好!
这是一个临时解决方案,重启后仍不起作用:
sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v
-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
此后我不得不将用户转至 Apache 以消除权限错误。
请注意,我使用find来定位库的目录。您也可以这样做:
sudo yum install mlocate
sudo updatedb
locate libpython3.5m.so.rh-python35-1.0
我的虚拟机上返回:
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
这是我需要提供给 ldconfig 的路径,如上所示。
解决方案 5:
这对我有用...
$ sudo apt-get install python2.7-dev
解决方案 6:
在 Solaris 11 上
用于LD_LIBRARY_PATH_64
解析到 python 库的符号链接。
就我而言,python3.6LD_LIBRARY_PATH
没有起作用,但LD_LIBRARY_PATH_64
确实起作用了。
希望这能有所帮助。
问候
解决方案 7:
这个答案对于那些在服务器上具有有限身份验证访问权限的人来说很有帮助。
python3.5
我在 HostGator 的共享主机中也遇到过类似的问题。Python3.5
每次登录后都必须启用。以下是我解决问题的 10 个步骤:
python_enable_3.5
通过 scl 脚本或启用 pythonscl enable rh-python35 bash
。通过执行来验证它是否已启用
python3.5 --version
。这将为您提供您的 Python 版本。执行
which python3.5
以获取其路径。 在我的情况下,它是/opt/rh/rh-python35/root/usr/bin/python3.5
。 您可以使用此路径再次获取版本(只是为了验证此路径是否适合您。)太棒了,现在请按 退出当前 shell
scl
。现在,让我们通过这个完整的python3.5路径再次获取版本
/opt/rh/rh-python35/root/usr/bin/python3.5 --version
。
它不会给你版本,而会显示错误。在我的情况下,它是
/opt/rh/rh-python35/root/usr/bin/python3.5: error while loading shared libraries: libpython3.5m.so.rh-python35-1.0: cannot open shared object file: No such file or directory
正如Tamas 的回答中提到的,我们必须找到该
so
文件。locate
在共享主机中不起作用,而且您也无法安装它。
使用以下命令查找该文件所在的位置:
find /opt/rh/rh-python35 -name "libpython3.5m.so.rh-python35-1.0"
一旦找到文件,上述命令就会打印文件的完整路径(第二行)。在我的例子中,输出为
find: `/opt/rh/rh-python35/root/root': Permission denied
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
以下是 python3.5 在这种共享主机中运行的完整命令,它将提供以下版本,
LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5 --version
最后,为了简便起见,在 ~/.bashrc 中附加以下别名
alias python351='LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5'
为了验证,请重新加载
.bashrc
并source ~/.bashrc
执行python351 --version
。
好了,就这样,现在无论你何时再次登录,都必须python351
欢迎你。
这不仅限于python3.5
,而且对于scl
安装的其他软件也会有帮助。
解决方案 8:
我使用以下命令安装:
./configure --prefix=/usr \n --enable-shared \n --with-system-expat \n --with-system-ffi \n --enable-unicode=ucs4 &&
make
现在,作为 root 用户:
make install &&
chmod -v 755 /usr/lib/libpython2.7.so.1.0
然后我尝试执行python并得到错误:
/usr/local/bin/python:加载共享库时出错:libpython2.7.so.1.0:无法打开共享对象文件:没有此文件或目录
然后,我从 root 用户注销并再次尝试执行 Python,并且成功运行。
解决方案 9:
它所需要的只是安装 libpython [3 或 2] dev 文件。
解决方案 10:
只需安装 python-lib。(python27-lib)。它将安装 libpython2.7.so1.0。我们不需要手动设置任何东西。
扫码咨询,免费领取项目管理大礼包!