13

在我所有可执行 Python 脚本的开头,我放了shebang行:

#!/usr/bin/env python

我在env python产生 Python 2.2 环境的系统上运行这些脚本。我的脚本很快就失败了,因为我手动检查了兼容的 Python 版本:

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

如果可能的话,我不想更改每个可执行文件上的 shebang 行;但是,我没有对机器的管理访问权限来更改结果,env python并且我不想强制使用特定版本,如:

#!/usr/bin/env python2.4

我想避免这种情况,因为系统可能有比 Python 2.4 更新的版本,或者可能有 Python 2.5 但没有 Python 2.4。

什么是优雅的解决方案?

[编辑:]我在提出问题时不够具体——我想让用户在没有手动配置的情况下执行脚本(例如路径更改或符号链接~/bin并确保您的 PATH~/bin在 Python 2.2 路径之前具有)。也许需要一些分发实用程序来防止手动调整?

4

5 回答 5

8

“env”只是执行它在 PATH env var 中找到的第一件事。要切换到不同的 python,请在调用脚本之前将该 python 的可执行文件的目录添加到路径中。

于 2008-09-02T21:25:40.520 回答
4

相当骇人听闻的解决方案 - 如果您的检查失败,请使用此功能(可能会显着改进)来确定可用的最佳解释器,确定它是否可以接受,如果可以,使用 os.system 或类似的东西和您的 sys.system 重新启动您的脚本。 argv 使用新的解释器。

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]
于 2008-09-03T20:32:40.217 回答
2

如果您正在运行脚本,那么您可以先将 PATH 变量设置为指向私有 bin 目录:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

然后,当您执行 python 脚本时,它将使用 python 2.4。您必须更改登录脚本才能更改 PATH。

或者,使用您想要的显式解释器运行您的 python 脚本:

$ /path/to/python2.4 <your script>
于 2008-09-02T21:28:03.320 回答
0

@morais:这是一个有趣的想法,但我认为也许我们可以更进一步。也许有一种方法可以使用Ian Bicking 的 virtualenv来:

  • 看看我们是否在一开始就在可接受的环境中运行,如果是,则什么也不做。
  • 检查 上是否存在特定于版本的可执行文件PATH,即检查是否python2.x存在for x in reverse(range(4, 10))。如果是这样,请使用更好的解释器重新运行该命令。
  • 如果不存在更好的解释器,请使用 virtualenv 尝试从旧版本的 Python 安装新版本的 Python 并获取任何必备包。

我不知道 virtualenv 是否能够做到这一点,所以我很快就会搞砸它。:)

于 2008-09-03T23:07:53.430 回答
0

如果您 (1) 绝对使用 shebangs 并且 (2) 能够在构建过程中使用 Autotools,那么这里有一个解决方案。

我昨晚刚刚发现您可以使用 autoconf 宏AM_PATH_PYTHON来查找最小的 Python 2二进制文件。操作方法在这里

因此,您的流程将是:

  • AM_PATH_PYTHON(2.4)在你的configure.ac
  • 将所有.py脚本重命名为.py.in(根据我的经验,这不会混淆vi
  • 用 .命名所有要生成的 Python 脚本AC_CONFIG_FILES
  • 而不是以 开头#!/usr/bin/env python,使用#!@PYTHON@

然后,您生成的Python 脚本将始终具有适当的 shebang。

所以,你有这个解决方案,至少是可能的,如果不切实际的话。

于 2013-10-04T18:27:17.367 回答