问题:Python可执行文件找不到libpython共享库
我正在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?
回答 0
尝试以下方法:
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
。当然,这是系统范围的设置。
回答 1
戴上我的掘墓者帽子…
我发现解决此问题的最佳方法是在编译时。由于您是一个设置前缀,因此无论如何最好还是明确告诉可执行文件在哪里可以找到其共享库。与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使用(如ffi
,readline
等)到extlib
Python目录树本身的目录。这样,我可以将python-$ {PYTHON_VERSION}目录焦油放置在任何地方,它将“起作用”(前提是您不遇到libc
任何libm
冲突)。当您尝试在同一盒子上运行多个版本的Python时,这也很有帮助,因为您无需不断更改LD_LIBRARY_PATH
或担心选择错误版本的Python库。
编辑:忘了提,如果你不设定编译会抱怨PYTHONPATH
环境变量,您所使用的作为前缀,并且无法编译某些模块,例如,延长上面的例子中,设置PYTHONPATH
在上使用的前缀以export PYTHONPATH=/apps/python-${PYTHON_VERSION}
… 为例
回答 2
我遇到了同样的问题,并以这种方式解决了这个问题:
如果您知道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
我在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的路径。
回答 4
在Solaris 11上
用于LD_LIBRARY_PATH_64
将符号链接解析为python库。
就我而言,对于python3.6 LD_LIBRARY_PATH
无效,但是有效LD_LIBRARY_PATH_64
。
希望这可以帮助。
问候
回答 5
这对我有用…
$ sudo apt-get install python2.7-dev
回答 6
我使用以下命令安装:
./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
它只需要安装libpython [3或2] dev文件即可。
回答 8
只需安装python-lib。(python27-lib)。它将安装libpython2.7.so1.0。我们不需要手动设置任何内容。