1

我有一个奇怪的。在同一台 Solaris 10 服务器上执行相同 python 二进制文件的不同用户会获得具有不同模块的不同版本。

这一切都开始了,因为脚本以 root 身份运行良好(找到 pexpect 模块),但作为任何其他用户失败(找不到 pexpect 模块)。

像我一样运行 python 我得到 python 2.6.4

Sandman HDS1234567 $ python -V
Python 2.6.4
Sandman HDS1234567 $ which python
/opt/csw/bin/python

如果我 sudo 到 root,我会得到 python 2.6.8

Sandman HDS1234567 $ sudo -s
Password:
bash-3.2# which python
/opt/csw/bin/python
bash-3.2# python -V
Python 2.6.8
bash-3.2#

即使使用完整路径显式调用 python 也会显示相同的奇怪行为。

Sandman HDS1234567 $ whoami ; /opt/csw/bin/python -V
mperino
Python 2.6.4

Sandman HDS1234567 $ sudo -s
Password:
bash-3.2# whoami ; /opt/csw/bin/python -V
root
Python 2.6.8

同一个二进制文件怎么会有两个不同的版本???

4

1 回答 1

0

问题在于,/opt/csw/bin/python要么是一个最小的可执行文件,它在没有绝对路径的情况下链接libpython2.6.so并遵循它,要么是一个围绕可执行文件的包装器,它本身最终链接到libpython2.6.so没有绝对路径的文件。

在您的用户环境中,您有一个LD_LIBRARY_PATH集合,/usr/lib/libpython2.6.so可以选择它。在您的根环境中,您不需要,因此选择了不同的 Python(也许/opt/csw/lib/libpython2.6.so是 ,但这只是一个猜测)。解释器的大部分内容都在 .so 中,而不是可执行文件中。

所以,第一个问题是,你为什么首先指定它LD_LIBRARY_PATH?如果您不需要它,请不要设置它。或者,如果您确实需要它,为什么 root 不需要它?

但是,如果这只是解决您无法以任何其他方式解决的其他问题的解决方法,那么最简单的解决方案是编写一个别名/函数/脚本,在子shell中运行Python,LD_LIBRARY_PATH并酌情设置/取消设置。

于 2013-10-15T20:26:33.077 回答