Python可执行文件找不到libpython共享库
我在CentOS 5上安装Python 2.7。我按如下方式构build和安装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在哪里可以findlibpython?
尝试以下操作:
LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python
如果/usr/local/lib
不在/usr/local/lib
则将其replace为安装了libpython2.7.so.1.0
的文件夹。
如果这个工作正常,你想永久性地改变,你有两个select:
-
将
export LD_LIBRARY_PATH=/usr/local/lib
到您的主目录中的.profile
文件中(只有当您使用在新shell实例启动时加载此文件的shell时才有效)。 此设置只会影响您的用户。 -
将
/usr/local/lib
添加到/etc/ld.so.conf
并运行ldconfig
。 当然,这是一个全系统的设置。
放在我的掘墓人帽子上…
我发现解决这个问题的最好方法是在编译时。 既然你是一个设置前缀无论如何不妨告诉可执行文件显式哪里find它的共享库。 与OpenSSL和其他软件包不同,Python不会给你很好的configuration指令来处理备用库path(不是每个人都是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它具有它在特定path中所需的运行时库。 您可以进一步采取这个想法来处理安装到标准系统位置以外的位置的依赖项。 例如,在我的系统上,因为我没有root权限,需要做几乎完全独立的Python安装,我的configuration行如下所示:
./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
等)到python目录树本身的extlib
目录中。 这样,我可以tar python – $ {PYTHON_VERSION}目录并将其放置在任何地方,它将“工作”(假设您不会遇到libc
或libm
冲突)。 这也有助于在同一个盒子上运行多个版本的Python,因为你不需要改变你的LD_LIBRARY_PATH
也不用担心拾取错误版本的Python库。
编辑:忘了提及,编译将会抱怨,如果你没有设置PYTHONPATH
环境variables作为你的前缀,并且无法编译某些模块,例如,扩展上面的例子,将PYTHONPATH
设置为前缀上面的例子用export PYTHONPATH=/apps/python-${PYTHON_VERSION}
…
我有同样的问题,我解决这个问题:
如果你知道libpython驻留在哪里,我认为它应该是/usr/local/lib/libpython2.7.so.1.0
,你可以创build一个符号链接:
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
现在,作为根用户:
make install && chmod -v 755 /usr/lib/libpython2.7.so.1.0
然后我试图执行python并得到错误:
/ usr / local / bin / python:加载共享库时出错:libpython2.7.so.1.0:无法打开共享目标文件:没有这样的文件或目录
然后,我从root用户注销,再次尝试执行Python,并成功地运行。
我在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
我想要一个适用于所有用户的全系统永久性解决scheme,因此排除将导出语句添加到.profile或.bashrc文件。 我在这里看到了解决scheme,然后意识到它实际上在这里的答案中提到了! 无论如何,在CentOS 7上,这些步骤是:
vim /etc/ld.so.conf
我的机器上只有:
include ld.so.conf.d/*.conf
所以我创build了一个新文件:
vim /etc/ld.so.conf.d/rh-python35.conf
并补充说:
/opt/rh/rh-python35/root/usr/lib64/
重新启动后,不需要执行以下步骤,但要手动重buildcaching:
sudo ldconfig
就是这样,脚本工作正常!
这是一个临时解决scheme,在重新启动时不起作用:
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
这个特殊的错误消失了。 顺便说一句,我必须chmod用户到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的path,如上所示。