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


143

我正在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?

Answers:


203

尝试以下方法:

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。当然,这是系统范围的设置。


有没有一种方法可以导出它以便与Eclipse一起使用?我已将其添加到我的.profile中,但是Eclipse无法启动gdb。(但是请注意:将其添加到ld.so.conf还是可以的)
Setheron 2012年

所以我检查了运行eclipse的环境变量,它确实具有正确的LD_LIBRARY_PATH。我相信,当它启动GDB时,它不会使用任何外壳程序,因此不会获取任何环境变量!在调试配置中设置libpython没有帮助,因为这仅适用于gdb实际加载的时间(但我需要lib来加载gdb本身)
Setheron 2012年

1
当您从命令行运行gdb并且在终端中正确设置了LD_LIBRARY_PATH 时,是否可以成功调试应用程序?如果没有,您可能必须在.gdbinit文件中设置LD_LIBRARY_PATH 。看到这个答案的详细信息:stackoverflow.com/a/7041845/156771

我需要LD_LIBRARY_PATH来启动gdb(python库),而不是实际调试应用程序。到目前为止,我只能通过在ldconfig中进行设置来对其进行修复。我可以通过CLI调试应用程序,因为它会从我的ZSHRC文件中提取LD_LIBRARY_PATH。
Setheron 2012年

10
对于任何尝试此操作的人,请注意:它只是“ / usr / local / lib”,而不是原始的“ include ld.so.conf.d / *。conf”开头的“ include”。
tims

79

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

我发现解决此问题的最佳方法是在编译时。由于您是一个设置前缀,因此无论如何最好还是明确告诉可执行文件在哪里可以找到其共享库。与OpenSSL和其他软件包不同,Python并没有为您提供出色的configure指令来处理备用库路径(并不是每个人都是您所知道的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它具有在特定路径中需要的运行时库。您可以进一步利用此想法来处理安装到标准系统位置以外的位置的依赖项。例如,在我的系统上,由于我没有超级用户访问权限,并且需要进行几乎完全独立的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等)到extlib蟒蛇目录树本身的目录。这样,我可以将python-$ {PYTHON_VERSION}目录焦油放置在任何地方,它将“起作用”(前提是您不遇到libc任何libm冲突)。当您尝试在同一盒子上运行多个版本的Python时,这也很有帮助,因为您无需不断更改LD_LIBRARY_PATH或担心选择错误版本的Python库。

编辑:忘了提,如果你不设定编译会抱怨PYTHONPATH环境变量,您所使用的作为前缀,并且无法编译某些模块,例如,延长上面的例子中,设置PYTHONPATH在上使用的前缀以export PYTHONPATH=/apps/python-${PYTHON_VERSION}... 为例


//,这看起来就像我要找的东西。在哪里可以找到有关“将python-version目录放在tar并将其放置在任何地方,它将“起作用”(如果您不遇到libc或libm冲突)的方法的更多信息”的方法?您认为值得单独提出一个stackoverflow.com问题吗?
弥敦道(Nathan Basanese),2015年

//,又该如何设置$PYTHON_VERSION
弥敦道(Nathan Basanese)2015年

//,我$PYTHON_VERSION在配置后设置。即使$PYTHON_VERSION设置了该集合,编译器Python build finished successfully! The necessary bits to build these optional modules were not found: _bz2 _curses _curses_panel _gdbm _lzma _sqlite3 _tkinter readline
仍会

//,是否需要对make命令和其他安装命令进行任何修改?
弥敦道(Nathan Basanese)2015年

1
@NathanBasanese在缺少bz2,curses,gdbm,lzma等情况下,需要首先编译每个前缀为的前缀,/apps/python-${PYTHON_VERSION}/extlib以确保它们的库和标头在Python make进程找到的正确位置。对于系统级软件包,您可能会被依赖于root用户事先为您安装这些软件包。或寻找一种可以编译并在extlib
Foosh 2015年

21

我遇到了同样的问题,并以这种方式解决了这个问题:

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


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

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

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

重新启动后,在Shell上一切正常,但是有时我的Web服务器仍然抱怨。还有另一种方法始终适用于外壳程序和服务器,并且更为通用。我在这里看到了解决方案,然后意识到它实际上也在这里的答案之一中提到了!无论如何,在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在那之后,我不得不让用户去摆脱权限错误。

请注意,我使用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的路径。


1
您可以通过转至/etc/profile.d并创建一个包含以下内容的文件来避免麻烦:#!/bin/bashsource scl_source enable rh-python35access.redhat.com/solutions/527703
道格(

2

在Solaris 11上

用于LD_LIBRARY_PATH_64将符号链接解析为python库。

就我而言,对于python3.6 LD_LIBRARY_PATH无效,但是有效LD_LIBRARY_PATH_64

希望这可以帮助。
问候


1

这对我有用...

$ sudo apt-get install python2.7-dev

嗨,这不是正确的解决方案,因为在此之后,您的自定义构建python二进制文件将使用从apt-get安装的.so中的.so。当它们具有相同版本时,这可能会导致问题,或者如果您修改了python源代码,则不会费劲。
中野梓(Azusa Nakano)

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,它成功运行。


0

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


-1

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


4
//,如果您使用的是CEntOS 6.3?在那里,这是行不通的,通常人们正在编译Python,以处理系统Python是一个奇怪的版本,损坏,不可靠或其他不希望破坏整个系统的愿望的情况。
弥敦道(Nathan Basanese)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.