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

2024-04-19 10:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在CentOS 5上安装Python2.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?


Tags: makebinconfigureusrlocalfilelibcshared
3条回答

请尝试以下操作:

LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python

如果/usr/local/lib不在/usr/local/lib中,请将其替换为安装libpython2.7.so.1.0的文件夹。

如果此操作有效并且您希望将更改永久化,则有两个选项:

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

  2. /usr/local/lib添加到/etc/ld.so.conf并运行ldconfig。当然,这是一个全系统的设置。

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

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

戴上我的掘墓人帽。。。

我发现解决这个问题的最好方法是在编译时。既然您是唯一的设置前缀,那么最好显式地告诉可执行文件在哪里找到它的共享库。与OpenSSL和其他软件包不同,Python没有为您提供很好的配置指令来处理备用库路径(并不是每个人都是您所知道的根目录…),在最简单的情况下,您所需要的是:

./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 --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环境变量设置为用作前缀的内容,并且未能编译某些模块,则编译会有问题,例如,要扩展上面的示例,请将PYTHONPATH设置为上面示例中使用的前缀,export PYTHONPATH=/apps/python-${PYTHON_VERSION}。。。

相关问题 更多 >