python根据用户启动不同的版本

时间:2013-10-15 18:36:32

标签: python solaris-10

我有一个奇怪的。在同一台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

同样的二进制文件如何是2个不同的版本???

1 个答案:

答案 0 :(得分: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酌情取消。