构建Python 2.6为共享库时出错(之前正常),有什么原因吗?
我在一个运行CentOS的VPS上,安装了Python 2.4,但这让我不得不小心,不想把它搞坏。所以我决定单独安装Python 2.6,然后使用virtualenv。昨天,我用--enable-shared选项安装了Python 2.6,这样我就可以编译mod_wsgi,结果一切都很顺利。今天,我不得不从头开始,重新安装Python 2.6作为共享库,但这次却出问题了,原因不明。我希望有人能告诉我为什么会出问题。
需要注意的是,我不是在问怎么修复,而是在问为什么会坏。我很确定修复的一个答案是“设置LD_LIBRARY_PATH变量”。但我不想这么做,原因有两个。第一,我昨天并没有这么做,结果一切都正常。第二,我必须避免破坏CentOS的Python 2.4部分,如果我通过.bashrc添加这个变量到我的环境中,我不确定会不会引起其他问题。
安装Python 2.6
deleted/created all relevant directories, not just *make clean*
tar -xzvf Python-2.6.6.tgz
./configure --prefix=/foo/python26 --enable-shared
make
make altinstall
一切看起来都正常,编译输出中没有明显的错误。只是Python就是无法运行。
明目张胆地隐藏一个库
bin/python2.6: error while loading shared libraries: libpython2.6.so.1.0:
cannot open shared object file: No such file or directory
[/foo/python26/lib]# ls -l
lrwxrwxrwx 1 root root 19 May 27 15:09 libpython2.6.so -> libpython2.6.so.1.0*
-r-xr-xr-x 1 root root 5624403 May 27 15:09 libpython2.6.so.1.0*
drwxr-xr-x 25 root root 20480 May 27 15:09 python2.6/
[/foo/python26/bin]# ls -l
-rwxr-xr-x 1 root root 10142 May 27 15:09 python2.6*
-rwxr-xr-x 1 root root 1433 May 27 15:09 python2.6-config*
missing file! yesterday there was a 'python' linked to python2.6
[/foo/python26/bin]# ldd python2.6
libpython2.6.so.1.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ababe46c000)
我不想设置LD_LIBRARY_PATH的第三个原因是,这根本没有任何意义。make过程创建了共享库,并把它复制到了正确的目录。Python知道它在哪里,那个文件就在它自己的lib目录下。
那么,从昨天正常工作到今天出问题,发生了什么变化呢?我安装了一些其他的包,比如django(我把它卸载了)和nginx——我没有卸载nginx,但我看不出它会对任何东西产生影响。
1 个回答
感谢Vensky关于安装Python 2.6的文章,我找到了一种解决办法——虽然我还是不太明白为什么会出问题,而且这个解决办法看起来有点笨拙。但至少现在是能用的。
首先,创建一个文件,里面写上这一行:
#/etc/ld.so.conf.d/python2.6.conf
/foo/python2.6/lib
然后运行ldconfig
命令,不需要加任何参数。
检查一下是否有效:
[~]# ldconfig -p | grep python
libpython2.6.so.1.0 (libc6,x86-64) => /foo/python26/lib/libpython2.6.so.1.0
libpython2.6.so (libc6,x86-64) => /foo/python26/lib/libpython2.6.so
libpython2.4.so.1.0 (libc6,x86-64) => /usr/lib64/libpython2.4.so.1.0
libpython2.4.so (libc6,x86-64) => /usr/lib64/libpython2.4.so
[/foo/python26/bin]# ldd python2.6
libpython2.6.so.1.0 => /foo/python26/lib/libpython2.6.so.1.0 (0x00002b351dc1a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b351dfca000)
Python 2.6现在肯定是能用的,而且看起来已经和共享库连接上了。并且它似乎不会影响系统里的Python 2.4。