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

我正在 CentOS 5上安装 Python 2.7

./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?

252659 次浏览

试试以下方法:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

如果 libpython2.7.so.1.0不在 /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。这当然是一个系统范围的设置。

我遇到了同样的问题,我用这种方法解决了它:

如果您知道 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,看看是否有效。

只需要安装 python-lib (python27-lib)。它会安装 libpython2.7. so1.0。我们不需要手动设置任何东西。

我使用以下命令安装:

./configure --prefix=/usr       \
--enable-shared     \
--with-system-expat \
--with-system-ffi   \
--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,结果成功了。

戴上我的掘墓帽。

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

./configure --enable-shared \
--prefix=/usr/local \
LDFLAGS="-Wl,--rpath=/usr/local/lib"

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

./configure --enable-shared \
--prefix=/usr/local \
LDFLAGS="-R/usr/local/lib"

rpath”标志告诉 python 在特定的路径中有它需要的运行时库。您可以进一步采用这种思想来处理安装到不同于标准系统位置的依赖关系。例如,在我的系统上,由于我没有 root 访问权限,并且需要进行几乎完全自包含的 Python 安装,因此我的 configure 行如下所示:

./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"

在本例中,我将 python 使用的库(如 ffireadline等)编译到 python 目录树本身内的 extlib目录中。通过这种方式,我可以将 PYTHON-${ PYTHON _ VERION }目录定位到任何地方,并且它将“工作”(前提是您不会遇到 libclibm冲突)。这在尝试在同一机器上运行多个版本的 Python 时也很有帮助,因为您不需要不断更改 LD_LIBRARY_PATH或担心选择错误版本的 Python 库。

编辑: 忘了提到,如果你没有把环境变量设置成你的前缀,编译器会抱怨的和未能编译一些模块,例如,扩展上述示例,设置 PYTHONPATH的前缀在上述示例中使用的 export PYTHONPATH=/apps/python-${PYTHON_VERSION}..。

我在 CentOS 7上安装了 Python 3.5 by 软件收藏。它本身工作得很好,但是当我尝试运行一个简单的 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

我想要一个适用于所有用户的系统范围的永久性解决方案,这样就不需要将导出语句添加到。个人资料或。巴希尔文件。有一个一行的解决方案,基于 红帽解决方案页面。谢谢你指出这一点的评论:

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 摆脱权限错误之后。

注意,我使用 找到来定位库的目录:

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 的路径,如上所示。

这招对我很管用。

$ sudo apt-get install python2.7-dev

它只需要安装 libpython [3或2] dev 文件即可。

在索拉里斯11号上

使用 LD_LIBRARY_PATH_64解析到 python 库的符号链接。

在我的案例中,python3.6 LD_LIBRARY_PATH不起作用,但是 LD_LIBRARY_PATH_64起作用。

希望这个能帮上忙。
问候

这个答案将有助于那些在服务器上具有有限身份访问权限的用户。

我在 HostGator 的共享主机中遇到过类似的 python3.5问题。Python3.5必须在每次登录后都启用。以下是我的10个解决方案:

  1. 通过 scl 脚本 python_enable_3.5scl enable rh-python35 bash启用 Python。

  2. 通过执行 python3.5 --version验证它是否已启用。

  3. 执行 which python3.5获取它的路径。对我来说,是 /opt/rh/rh-python35/root/usr/bin/python3.5。您可以使用此路径再次获取版本(只是为了验证此路径是否适合您)

  4. 太棒了,现在请通过 scl退出当前 shell。

  5. 现在,让我们通过这个完整的 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
  1. 正如在 Tamas 的回答中提到的,我们必须找到那个 so文件。locate不能在共享主机中工作,你也不能安装它。

    使用以下命令查找该文件的位置:

find /opt/rh/rh-python35 -name "libpython3.5m.so.rh-python35-1.0"
  1. 上面的命令将打印文件的完整路径(第二行)
find: `/opt/rh/rh-python35/root/root': Permission denied
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
  1. 下面是 python3.5在这种共享主机中工作的完整命令,
LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5 --version
  1. 最后,作为速记,在 ~/. bashrc 中附加以下别名
alias python351='LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5'
  1. 为了验证,通过 source ~/.bashrc重新加载 .bashrc并执行 python351 --version

好了,这就是了,现在无论你什么时候再次登录,你都会得到 python351的欢迎。

这不仅仅局限于 python3.5,而且对于其他安装了 scl的软件也有帮助。