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

时间:2011-10-24 18:58:36

标签: 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?

10 个答案:

答案 0 :(得分:192)

尝试以下方法:

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的文件夹。

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

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

  2. /etc/ld.so.conf添加到ldconfig并运行{{1}}。当然,这是一个系统范围的设置。

答案 1 :(得分:69)

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

我发现解决此问题的最佳方法是在编译时。既然你是一个设置前缀,那么也可以明确告诉可执行文件在哪里找到它的共享库。与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 --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_VERSION}目录进行tar操作并将其置于任何位置并且它将“正常工作”(前提是您没有遇到libclibm冲突)。当尝试在同一个盒子上运行多个版本的Python时,这也有帮助,因为您不需要继续更改LD_LIBRARY_PATH或担心选择错误版本的Python库。

编辑:忘记提及,如果您没有将PYTHONPATH环境变量设置为您用作前缀的,并且无法编译某些模块,编译将会抱怨,例如,要扩展上面的示例,请使用PYTHONPATHexport PYTHONPATH=/apps/python-${PYTHON_VERSION}设置为上例中使用的前缀...

答案 2 :(得分:18)

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

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

答案 3 :(得分:5)

我在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 solutions页面的单行解决方案。感谢您指出的评论:

echo 'source scl_source enable rh-python35' | sudo tee --append /etc/profile.d/python35.sh

重新启动后,它在shell上都很好,但有时候我的网络服务器仍然会抱怨。还有另一种方法,它始终适用于shell和服务器,并且更通用。我看到了解决方案here,然后在其中一个答案中实际提到了它!无论如何,在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 /根的/ 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

在我的VM上返回:

/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

我需要为ldconfig提供哪条路径,如上所示。

答案 4 :(得分:1)

这对我有用......

$ sudo apt-get install python2.7-dev

答案 5 :(得分:1)

在Solaris 11上

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

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

希望这会有所帮助。
问候

答案 6 :(得分: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并且它成功运行。

答案 7 :(得分:0)

所需要的只是安装libpython [3或2] dev文件。

答案 8 :(得分:0)

此答案对那些在服务器上的身份验证访问权限有限的人会有所帮助。

我在 HostGator 的共享主机中遇到了类似的 python3.5 问题。 Python3.5 必须在登录后的每一次该死的时间启用。以下是我解决问题的 10 个步骤:

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

  2. 通过执行 python3.5 --version 验证它是否已启用。这应该给你你的 python 版本。

  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' answer 中所述,我们必须找到 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. 为了验证,请通过 .bashrc 重新加载 source ~/.bashrc 并执行 python351 --version

好了,现在只要您再次登录,您就会得到 python351 的欢迎。

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

答案 9 :(得分:-1)

只需安装python-lib。 (python27-LIB)。它将安装libpython2.7.so1.0。我们不需要手动设置任何内容。