我有成千上万的服务器(linux),有些只有python 2.x而有些只有python 3.x,我想写一个脚本check.py可以在所有服务器上运行,就像$。/ check.py一样不使用$ python check.py或$ python3 check.py,有没有办法做到这一点?
我的问题是脚本check.py如何找到解释器,无论解释器是python2.x还是python3.x
答案 0 :(得分:14)
许多脚本可以在2.x和3.x上运行。 (我每天都有一堆工作,我已经将各种开源库从2.x转换为双版本。)
有些事情会让事情变得更容易:
u
前缀)在3.2或3.3中被颠倒过来。__future__
语句。bytes
(总是8位),unicode
(必须编码,如果你想要8位),或str
(无论大多数) stdlib API的期望值,以及必要的encode
和decode
。2to3
。 (但不要盲目地做它所说的一切。例如,如果你使用的是d.keys()
或map(f, l)
,因为你不关心你是否回到list
,你会收到警告,因为2to3
不知道你不在乎。)或者,不是尝试编写在两者上运行的代码,而是编写在2.x上运行的代码,但可以通过2to3
自动转换为运行的3.x代码,并使其成为安装的一部分流程(在setup.py
,if sys.version_info >= (3, 0):
执行2to3
步骤。)
从你的编辑中,听起来你最关心的是放在#中的内容!线。为此:
/usr/bin/env python
这不能保证工作 - 但是env
不能保证在第一位工作......你可以指望这样的事实:
python
是Python 2。python
是Python 2。python
是Python 3。然而:
如果最后一个是严重问题,您可以通过添加一个用sh编写的启动器脚本来尝试python
,然后尝试python
如果失败,则可以解决它。
执行此操作的好方法是将启动器脚本本身指定为Python脚本中的shebang解释器。 Linux可以处理这个问题,但它是可配置的,并且至少有一些发行版默认禁用它 - 而且大多数其他* nix系统都不能这样做。
如果这不起作用,下一个最佳选择是让用户运行启动器脚本 - 也就是说,告诉他们执行python3
而不是./check.sh
和./check.py
找出合适的Python解释器并为用户运行check.sh
。
如果你想变得非常棘手,你甚至可以将Python脚本作为heredoc嵌入shell脚本中,所以你只需要分发一个文件。它们运行$python ./check.py
,它找到正确的Python并在heredoc上运行它。
答案 1 :(得分:0)
考虑到Python 3.x并不完全向后兼容Python 2.x,您必须确保脚本与这两个版本兼容。这可以通过2to3
工具的一些帮助来完成,但最终可能意味着运行两个不同的Python脚本。
答案 2 :(得分:0)
在一般情况下,不可以;许多Python 2脚本无法在Python 3上运行,反之亦然。他们是两种不同的语言。
话虽如此,如果您小心的话,可以编写一个可以在两个脚本下正确运行的脚本。一些作者会格外小心,以确保他们的脚本在两个版本之间都是兼容的,通常使用six
库之类的附加工具(名称是双关语;您可以通过将“二乘三”乘以“六”)。或“三乘二”)。
但是,现在是2020年,Python 2正式死亡。许多以前一直努力维护Python 2兼容性但仍受其支持的维护人员现在将松一口气,并且常常会非常乐意为以后的开发工作插上插头。