3

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

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

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

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

4

3 回答 3

6

从著名的 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"
于 2012-09-26T17:53:04.230 回答
4

unix 方法是指定python2- 大多数好的发行版现在将安装 2.x aspython2和 3.x as python3,将主要的一个链接到python(在大多数发行版中,2.x)。因此,最好明确指定您想要的那个。

这一切都在PEP 394中定义,其中规定:

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

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

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

于 2012-09-26T16:34:57.777 回答
0

如果必须继续运行python 2,最好也将解释器称为python2. 我认为大多数 UNIX 版本都有来自/usr/bin/python//usr/bin/python2指向适当二进制文件的符号链接。

于 2012-09-26T16:35:17.217 回答