在我所有可执行 Python 脚本的开头,我将 舍邦 线:

#!/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 并确保你的路径有 ~/bin 在 Python 2.2 路径之前)。也许需要一些分发实用程序来防止手动调整?

有帮助吗?

解决方案

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

其他提示

相当黑客的解决方案 - 如果您的检查失败,请使用此功能(可能可以显着改进)来确定可用的最佳解释器,确定它是否可以接受,如果可以,请使用 os.system 或类似的东西以及您的 sys.path 重新启动您的脚本。 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]

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

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

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

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

$ /path/to/python2.4 <your script>

@莫莱斯:这是一个有趣的想法,但我想也许我们可以更进一步。也许有一种方法可以使用 Ian Bicking 的 virtualenv 到:

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

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

如果您 (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。

所以,你有这个解决方案,即使不实用,至少也是可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top