【问题标题】:python launches a different version depending on userpython根据用户启动不同的版本
【发布时间】: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/pythonMach-O universal binary。 Windows py.exePE 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


【解决方案1】:

问题在于,/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 设置/取消设置为合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多