我正在 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?
尝试以下操作:
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
。当然,这是一个系统范围的设置。
戴上我的掘墓人帽子...
我发现解决这个问题的最好方法是在编译时。 由于您无论如何都是设置前缀,因此不妨明确告诉可执行文件在哪里可以找到其共享库。 与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使用的库(如ffi
,readline
等(编译到python目录树本身的extlib
目录中。 这样我就可以 tar python-${PYTHON_VERSION} 目录并将其放在任何地方,它将"工作"(前提是您不会遇到libc
或libm
冲突(。 当尝试在同一机器上运行多个版本的 Python 时,这也很有帮助,因为您无需不断更改LD_LIBRARY_PATH
或担心选择错误版本的 Python 库。
编辑:忘了提,如果您没有将PYTHONPATH
环境变量设置为用作前缀的变量并且无法编译某些模块,例如,要扩展上述示例,请将PYTHONPATH
设置为上面示例中使用的前缀,并带有export PYTHONPATH=/apps/python-${PYTHON_VERSION}
我遇到了同样的问题,我用这种方式解决了它:
如果你知道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
,看看它是否有效。
我在 CentOS 7 上安装了 Python 3.5 by Software Collections。它本身工作正常,但是当我尝试运行简单的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 文件。有一个基于红帽解决方案页面的单行解决方案。感谢您指出的评论:
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
我的 VM 上返回的哪个:
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
这是我需要给ldconfig的路径,如上所示。
我有用...
$ sudo apt-get install python2.7-dev
在 Solaris 11 上
使用 LD_LIBRARY_PATH_64
解析到 python 库的符号链接。
就我而言,python3.6 LD_LIBRARY_PATH
不起作用,但LD_LIBRARY_PATH_64
起作用了。
希望这有帮助。
问候
这个答案对那些在服务器上具有有限身份验证访问权限的人很有帮助。
我在 HostGator 的共享主机中遇到了类似的python3.5
问题。 Python3.5
登录后每次都必须启用。以下是我解决的 10 个步骤:
通过 scl 脚本启用 python
python_enable_3.5
或scl enable rh-python35 bash
。通过执行
python3.5 --version
验证它是否已启用。这应该给你你的python版本。执行
which python3.5
以获取其路径。就我而言,这是/opt/rh/rh-python35/root/usr/bin/python3.5
.您可以使用此路径再次获取版本(只是为了验证此路径是否适合您。太棒了,现在请通过
scl
退出当前外壳。现在,让我们通过这个完整的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
正如塔玛斯的回答中提到的,我们必须找到那个
so
文件。locate
在共享主机中不起作用,您也无法安装它。使用以下命令查找该文件所在的位置:
find /opt/rh/rh-python35 -name "libpython3.5m.so.rh-python35-1.0"
- 上面的命令将在找到文件后打印文件的完整路径(第二行(。在我的情况下,输出是
find: `/opt/rh/rh-python35/root/root': Permission denied
/opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0
- 这是 python3.5 在此类共享主机中工作的完整命令,它将提供版本,
LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5 --version
- 最后,为了速记,在您的 ~/.bashrc 中附加以下别名
alias python351='LD_LIBRARY_PATH=/opt/rh/rh-python35/root/usr/lib64 /opt/rh/rh-python35/root/usr/bin/python3.5'
- 为了进行验证,请通过
source ~/.bashrc
重新加载.bashrc
并执行python351 --version
。
现在每当你再次登录时,你都有python351
欢迎你。
这不仅限于python3.5
,而且在其他scl
安装的软件的情况下会有所帮助。
我使用以下命令安装:
./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,它成功运行。
它所需要的只是安装 libpython [3 或 2] 开发文件安装。
只需安装 python-lib。(python27-lib(。它将安装 libpython2.7.so1.0。我们不需要手动设置任何内容。