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

Python executable not finding libpython shared library

我在Centos 5上安装python 2.7。我构建并安装了python,如下所示

1
2
3
./configure --enable-shared --prefix=/usr/local
make
make install

当我尝试运行/usr/local/bin/python时,会收到这个错误消息

1
/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时,我得到

1
2
3
4
5
6
7
8
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?


试试下面的:

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

与"replace /usr/local/lib文件夹,你要安装libpython2.7.so.1.0如果它不在/usr/local/lib冰。

如果这个工程和你想做永久性的变化,你有两个选择:

  • .profileexport LD_LIBRARY_PATH=/usr/local/lib加在你的home目录(本厂以只读的如果你在A壳载荷的这个文件,当一个新的冰壳开始审)。这个设置会影响你的用户只。

  • 添加两个/etc/ld.so.conf/usr/local/libldconfig跑了。这是一个系统的设置范围的大学课程。


  • 在对我的掘墓者的帽子…

    最好的方式是解决这两个发现冰的编译时间。既然你是一位字头无论如何,不妨告诉executable没有在图书馆找到它的共享。unlike OpenSSL软件包和其他Python,不给你两个很好的指示作用alternate configure图书馆(不是每个人都paths根冰激凌,你知道的……)simplest案例的所有你需要的是以下:

    1
    2
    3
    ./configure --enable-shared \
                --prefix=/usr/local \
                LDFLAGS="-Wl,--rpath=/usr/local/lib"

    或如果你prefer非Linux版本:

    1
    2
    3
    ./configure --enable-shared \
                --prefix=/usr/local \
                LDFLAGS="-R/usr/local/lib"

    "rpath"标志,它告诉Python运行时信息需求的图书馆,在那特殊的路径。你可以把这两个想法进一步行动dependencies安装了两个不同的位置比标准的系统位置。例如,在我的系统中,由于不需要root访问需要化妆是完全自包含Python installs configure线,我看起来像这样:

    1
    2
    3
    4
    5
    6
    7
    ./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 _美元{ }版本目录和信息网络的任何地方和国家意志的"工作"(只要你不要跑到libclibmconflicts)。这也helps当想跑多大学的在线版本的Python一样的盒子,你不需要保持或改变你的LD_LIBRARY_PATH担心出现"错误的版本的Python库。

    编辑:忘了说,这会complain编译,如果你不看PYTHONPATH两个环境变量作为你和你的两个字头的编译模块有故障,例如,他们的两个以上的实例,看过《PYTHONPATHPREFIX用于两个以上的实例与export PYTHONPATH=/apps/python-${PYTHON_VERSION}


    在仇恨中一样的问题和solved网络这种方式:

    如果你知道在哪里libpython resides应该去的,它会在你的/usr/local/lib/libpython2.7.so.1.0案例,你只是创建一个符号链接的信息:

    1
    sudo ln -s /usr/local/lib/libpython2.7.so.1.0 /usr/lib/libpython2.7.so.1.0

    然后再尝试运行ldd看看它是否工作。


    我在Centos7 Minimal上安装了由软件收集的python 3.5。这一切本身都很好,但是我在运行一个简单的CGI脚本时看到了这个问题中提到的共享库错误:

    1
    2
    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文件添加export语句。基于Red Hat Solutions页面,有一个单行解决方案。感谢您的评论:

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

    重新启动后,shell上的一切都很好,但有时我的Web服务器仍然会抱怨。还有另一种方法始终适用于shell和服务器,而且更通用。我在这里看到了解决方案,然后意识到它实际上也出现在这里的一个答案中!无论如何,在Centos 7上,以下是步骤:

    1
     vim /etc/ld.so.conf

    我的机器上有:

    1
    include ld.so.conf.d/*.conf

    所以我创建了一个新文件:

    1
    vim /etc/ld.so.conf.d/rh-python35.conf

    并补充说:

    1
    /opt/rh/rh-python35/root/usr/lib64/

    手动重建缓存:

    1
    sudo ldconfig

    就这样,脚本工作得很好!

    这是一个临时解决方案,在重新启动时无法正常工作:

    1
    sudo ldconfig /opt/rh/rh-python35/root/usr/lib64/ -v

    -v(verbose)选项只是查看发生了什么。我看到了:/opt/rh/rh-python35/root/usr/lib64:libpython3.so.rh-python35->libpython3.so.rh-python35libpython3.5m.so.rh-python35-1.0->libpython3.5m.so.rh-python35-1.0

    这个错误消失了。顺便说一句,我不得不让用户chown到apache,以便在这之后消除权限错误。

    请注意,我使用find查找库的目录。你也可以这样做:

    1
    2
    3
    sudo yum install mlocate
    sudo updatedb
    locate libpython3.5m.so.rh-python35-1.0

    在我的虚拟机上返回:

    1
    /opt/rh/rh-python35/root/usr/lib64/libpython3.5m.so.rh-python35-1.0

    这是我需要给ldconfig的路径,如上图所示。


    关于Solaris 11

    使用LD_LIBRARY_PATH_64将symlink解析为python libs。

    在我的例子中,python3.6 LD_LIBRARY_PATH没有起作用,但LD_LIBRARY_PATH_64起作用。

    希望这有帮助。当做


    这对我有用…

    1
    $ sudo apt-get install python2.7-dev


    它所需要的只是安装libpython[3或2]dev文件安装。


    在安装使用的命令:

    1
    2
    3
    4
    5
    6
    7
    ./configure --prefix=/usr       \
                --enable-shared     \
                --with-system-expat \
                --with-system-ffi   \
                --enable-unicode=ucs4 &&

    make

    现在,作为根用户的:

    1
    2
    make install &&
    chmod -v 755 /usr/lib/libpython2.7.so.1.0

    然后我想execute 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

    然后,从根中记录了用户的鸭子看了《Python execute successfully挤压它。


    完全安装的Python库。(python27-Arg)。它将安装libpython2.7.so1.0.我们不需要看两个东西表壳,手动上弦。