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呢?
10 个回答
我也遇到过同样的问题,我是这样解决的:
如果你知道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使用的库(比如ffi
、readline
等)编译到Python目录树中的一个extlib
目录里。这样我就可以把python-${PYTHON_VERSION}目录打包,放到任何地方,它都能“正常工作”(前提是你没有遇到libc
或libm
的冲突)。这也有助于在同一台机器上运行多个版本的Python,因为你不需要一直更改LD_LIBRARY_PATH
,也不用担心会用错Python库的版本。
补充一下:我忘了提,如果你不把PYTHONPATH
环境变量设置为你使用的前缀,编译时会报错,某些模块会编译失败。例如,继续上面的例子,把PYTHONPATH
设置为上面例子中的前缀,使用export PYTHONPATH=/apps/python-${PYTHON_VERSION}
...
试试下面的方法:
LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python
如果你安装的 libpython2.7.so.1.0
不在 /usr/local/lib
这个文件夹里,就把 /usr/local/lib
替换成你安装它的文件夹。
如果这样能解决问题,而且你想让这个设置一直有效,有两个方法可以选择:
在你家目录下的
.profile
文件里添加export LD_LIBRARY_PATH=/usr/local/lib
。这个方法只有在你使用的命令行工具会在新开一个命令行窗口时加载这个文件时才有效。这个设置只会影响到你这个用户。把
/usr/local/lib
添加到/etc/ld.so.conf
文件里,然后运行ldconfig
。这个设置是全系统有效的。