【问题标题】:Scripting Hashbang: How to get the python 2 interpreter?Scripting Hashbang:如何获得 python 2 解释器?
【发布时间】:2012-09-18 08:25:06
【问题描述】:

我正在编写必须在许多不同的类 UNIX 版本上运行的脚本。 这些是用 python 2.x 编写的。

不幸的是,一些较新的版本已将这种风味二进制文件称为“python2”而不是“python”。因此,“#!/usr/bin/env python”无法查找正确安装的 python 解释器。要么我得到版本 3 解释器(坏),要么根本没有解释器(更糟!)

有没有一种聪明的方法来编写一个 python 脚本,如果安装了它会加载 python2 解释器,否则如果安装了 python 解释器?我必须使用其他机制来检测“python”何时是 python3,但由于那时我处于类似 python 的环境中,所以我可以忍受。

我想我可以编写一个涟漪启动器,将其称为“findpython2”,并将其用作 #!脚本的解释器,但这意味着我必须在搜索路径中安装 findpython2,这绝对是次优的(这些脚本通常通过绝对引用调用,因此它们不在路径中。)

【问题讨论】:

    标签: python linux shell unix python-2.7


    【解决方案1】:

    从著名的 perl hashbang 技巧中获得灵感,我想出了这个:

    #!/bin/sh
    """":
    python2 -c "" 2>/dev/null && exec python2 $0 ${1+"$@"}
    python  -c "" 2>/dev/null && exec python  $0 ${1+"$@"}
    echo "Could not find a python interpreter."
    exit 1
    """
    
    print "hello python"
    

    【讨论】:

    • 如果有人知道更好的方法来测试路径中是否存在某个程序,我很想知道。
    • 也可以使用:$(type -p python2) && interp=python2 || interp=python; exec $interp "$0" ${1+"$@"}
    • 这实际上回答了这个问题。甜的!此外,一个非常可怕的黑客:-)
    • @JonWatte:如果您只打算在健全的外壳上使用它,您可以使用 glenn 的 type -p 建议。它适用于我测试的任何地方,保存在busybox的msh上(然后,也许busybox menuconfig上有一个选项)。 OTOH,POSIX 标准化 type,但不是 type -p
    【解决方案2】:

    如果您必须在python 2 上运行,您最好也将解释器称为python2。我认为大多数 UNIX 版本都有从 /usr/bin/python//usr/bin/python2 到相应二进制文件的符号链接。

    【讨论】:

    • 见上文——这个答案实际上并没有回答我提出的问题。
    【解决方案3】:

    unix 方式是指定python2 - 大多数优秀的发行版现在会将 2.x 安装为 python2 和 3.x 安装为 python3,将 main 中的任何一个链接到 @ 987654325@(在大多数发行版中,2.x)。因此,最好明确指定您想要的。

    这都是在PEP 394 中定义的,其中指出:

    此 PEP 提供了一个约定以确保 Python 脚本可以 继续在 *nix 系统之间移植,不管默认值如何 Python 解释器的版本(即由 python 命令)。

    • python2 将引用 Python 2.x 的某些版本
    • python3 将引用 Python 3.x 的某些版本
    • python 应该与 python2 引用相同的目标,但在某些前沿分布中可能会引用 python3

    因此,如果发行版不这样做,则本质上是他们的错误。

    【讨论】:

    • 感谢您的回答。不幸的是,它忽略了时间的影响。一个重要的目标发行版是 Ubuntu 10.04 LTS(该发行版还有三年的支持。)它不安装这些链接。你是否称它为“错误”并不重要,因为这是我需要接受的基本事实。此外,虽然试图解决我的“实际”问题,但这个答案并没有真正回答问题。
    • @JonWatte 我的建议是提供一个修补脚本来建立该链接。
    • 我不想要求 root,我当然也不想要求在 /usr/bin 中安装任何东西。
    • @JonWatte 足够公平 - 我建议将缺少该链接作为一个错误报告 - 因为它仍然受支持并且添加链接除了帮助之外应该没有任何作用,我想它有一个很好的被加入的机会。
    • 问题是 Arch 认为该链接指向 python3,而我只安装了 python2。如果我安装 python3,链接就在那里。这意味着任何使用 print 并期望“python”为“python3”的脚本本质上是不兼容的。这将是......有趣......看看它在 Ubuntu 等主流发行版中的表现如何!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2015-07-31
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多