我有一个奇怪的。在同一个solaris10服务器上执行同一python二进制文件的不同用户将获得具有不同模块的不同版本。。在
这一切的开始是因为一个脚本以root用户身份运行良好(找到pexpect模块),但与其他用户一样失败(无法找到pexpect模块)。在
像我一样运行python得到python2.6.4
Sandman HDS1234567 $ python -V
Python 2.6.4
Sandman HDS1234567 $ which python
/opt/csw/bin/python
如果我使用sudo作为根目录,我得到python2.6.8
^{pr2}$即使用完整路径显式调用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
同一个二进制文件怎么可能是两个不同的版本???在
问题是
/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
?如果你不需要它,就不要设置它。或者,如果你需要它,为什么根不需要它?在但是,如果这只是一个解决其他问题的方法,而其他方法无法解决这些问题,那么最简单的解决方案是编写一个别名/函数/脚本,在子shell中运行Python,并酌情使用
LD_LIBRARY_PATH
set/unset。在相关问题 更多 >
编程相关推荐