我有数千台服务器(linux),有些只有 python 2.x,有些只有 python 3.x,我想编写一个脚本 check.py 可以在所有服务器上运行,就像 $./check.py 一样,无需使用 $ python check.py 或 $python3 check.py,有什么办法可以做到这一点?
我的问题是脚本 check.py 如何找到解释器,无论解释器是 python2.x 还是 python3.x
许多脚本可以在 2.x 和 3.x 上运行。 (我每天都有很多工作要做,并且我已经将各种开源库从纯 2.x 转换为双版本。)
有几件事让它变得更容易:
- 2.x 用户需要 2.7 或至少 2.6+。否则,例如,您无法使用参数引发异常或将它们捕获到变量中,以及其他此类严格的限制。
- 对于 3.x 用户,需要 3.3+,或至少 3.2+。大多数无端的不兼容性(例如
u
前缀被去掉)在 3.2 或 3.3 中被颠倒。
- Use the six http://packages.python.org/six/图书馆。
- Use
__future__
声明。
- 头脑中始终清楚你的意思是
bytes
(始终为 8 位),unicode
(如果您想要 8 位,则必须编码),或者str
(无论大多数 stdlib API 期望什么),以及encode
and decode
有必要的。
- 定期运行
2to3
在你的代码上。 (但是不要盲目地按照它所说的去做。例如,如果您正在使用d.keys()
or map(f, l)
因为你不在乎是否能回来list
或不,你会收到警告,因为2to3
不知道你不在乎。)
或者,不要尝试编写在两者上运行的代码,而是编写在 2.x 上运行但可以自动转换的代码2to3
运行 3.x 代码,并将其作为安装过程的一部分(在setup.py
, if sys.version_info >= (3, 0):
do the 2to3
step).
从您的编辑来看,听起来您最关心的是在 # 中放入什么内容!线。为了那个原因:
/usr/bin/env python
这并不能保证有效——但是之后env
并不能保证一开始就能工作……您可以相信以下事实:
- 在平台/发行版仅提供 2.x 的几乎任何系统上,
python
是Python 2。
- 在平台/发行版提供两者的几乎任何系统上,
python
是Python 2。
- 在平台/发行版仅提供 3.x 的几乎任何系统上(目前非常罕见,但可能最终会更加常见),
python
是Python 3。
However:
- 在平台提供的系统上neither,如果管理员只安装了 3.x,则很可能(截至 2013 年初)not可以作为
python
。对此你无能为力。
如果最后一个是一个严重的问题,您可以通过添加一个用 sh 编写的启动器脚本来解决它,该脚本会尝试python
然后尝试python3
如果失败了。
执行此操作的好方法是将启动器脚本本身指定为 Python 脚本中的 shebang 解释器。 Linux 可以处理这个问题,但它是可配置的,并且至少有一些发行版默认禁用它,而大多数其他 *nix 系统则无法做到这一点。
如果这不起作用,下一个最佳选择是让用户运行启动器脚本,也就是说,告诉他们这样做./check.sh
代替./check.py
, and check.sh
找出正确的Python解释器并运行$python ./check.py
对于用户来说。
如果你想变得更棘手,你甚至可以将 Python 脚本作为定界文档嵌入到 shell 脚本中,这样你只需要分发一个文件。他们跑./check.sh
,它会找到正确的 Python 并在 Heredoc 上运行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)