【发布时间】:2013-10-15 18:36:31
【问题描述】:
我有一个奇怪的。在同一台 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
同一个二进制文件怎么会有两个不同的版本???
【问题讨论】:
-
文件 /opt/csw/bin/python 是一个二进制文件:#file /opt/csw/bin/python /opt/csw/bin/python: ELF 32-bit MSB executable SPARC32PLUS Version 1 , V8+ 必需,动态链接,剥离,包信息为:# pkginfo -l CSWpython PKGINST: CSWpython NAME: python - 高级脚本语言,2.6 系列 CATEGORY: application ARCH: sparc VERSION: 2.6.8,REV=2013.02 .27 BASEDIR:/供应商:python.org/download/releases/2.6.8 Maciej Blizinski 为 CSW 打包 PSTAMP:maciej@unstable10s-20130227151141
-
很可能
/opt/csw/bin/python实际上是多个不同 Python 的包装器(很像 Apple 的/usr/bin/python是围绕 2.5、2.6 或 2.7 的包装器),它选择哪一个取决于一些环境变量.但是如果没有看到您的环境,或者没有看到python链接到什么,就很难更具体了。 -
它不是符号链接或包装脚本。似乎是 Solaris 二进制文件。对它运行“文件”将其显示为“ELF 32 位 MSB 可执行 SPARC32PLUS 版本 1,V8+”,这是令人费解的部分。为什么二进制文件会根据用户启动不同的版本?
-
嗯,这显然不是符号链接。但是它是二进制而不是脚本这一事实如何意味着它不是包装器?苹果的
/usr/bin/python是Mach-O universal binary。 Windowspy.exe是PE executable。这正是我问python与哪个so 相关联的原因——如果它是一个脚本,这个问题就没有任何意义。 -
我在兔子洞的深处,我现在明白是什么触发了它选择旧版本,但我不喜欢这个逻辑。如果 LD_LIBRARY_PATH 包含 /usr/lib 则启动 2.6.4 如果 LD_LIBRARY_PATH 为空白或不包含 /usr/lib 则启动 2.6.8 查找 /usr/lib 有来自 libpython2.6.so -> libpython2 的链接.6.so.1.0 和 libpython2.6_db.so -> libpython2.6_db.so.1.0 我假设这些库是导致它选择该版本的原因。
标签: python solaris-10