构建Python 2.6为共享库时出错(之前正常),有什么原因吗?

0 投票
1 回答
5460 浏览
提问于 2025-04-16 18:29

我在一个运行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 个回答

3

感谢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。

撰写回答