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 时,收到此错误消息...

问题描述:

我在 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`

如果此方法有效并且您想要使更改永久生效,则您有两个选择:

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

  2. 添加并运行/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 使用的库(如、等)编译ffireadlinePythonextlib目录树本身的目录中。这样,我可以将 python-${PYTHON_VERSION} 目录打包并放到任何地方,它都会“工作”(前提是您不会遇到libclibm冲突)。这在尝试在同一台机器上运行多个版本的 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 个步骤:

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

  2. 通过执行来验证它是否已启用python3.5 --version。这将为您提供您的 Python 版本。

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

  4. 太棒了,现在请按 退出当前 shell scl

  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. 为了验证,请重新加载.bashrcsource ~/.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。我们不需要手动设置任何东西。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用