我有一个奇怪的。在同一台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个不同的版本???
答案 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
酌情取消。