我有数千台服务器(linux),有些只有python 2.x,有些只有python 3.x。我想编写一个名为check.py的脚本,可以在所有服务器上运行,就像$./check.py一样,而不需要使用$python check.py或$python3 check.py。有没有办法做到这一点?
我的问题是如何让脚本check.py找到解释器,无论解释器是python2.x还是python3.x。
我有数千台服务器(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改为支持双版本)。
以下几点会使它更容易:
u
)在3.2或3.3中被撤消了。__future__
语句。bytes
(始终为8位)、unicode
(如果要得到8位,则必须编码)还是str
(大多数标准库API所需的内容),并根据需要进行encode
和decode
。2to3
。(但不要盲目执行它说的所有操作。如果,例如,您正在使用d.keys()
或map(f, l)
,因为您不关心是否返回list
,那么您会收到警告,因为2to3
不知道您不关心)。或者,不要尝试编写可同时运行于两个版本的代码,而是编写运行于2.x但可以自动转换为3.x代码的代码,并将其作为安装过程的一部分(在setup.py
中,如果sys.version_info >= (3, 0)
则执行2to3
步骤)。
从您的编辑内容看,似乎您主要关注要在#!行中放什么。对于这个问题:
/usr/bin/env python
不能保证此方法一定有效,但是env
的功能本来就没有保证。你可以肯定:
python
都是Python 2。python
都是Python 2。python
都是Python 3。然而:
python
可用。这个问题没有什么好的解决办法。如果以上情况成为一个严重问题,您可以通过添加一个 sh 脚本的启动器来解决,在其中尝试使用 python
和 python3
运行您的程序。
比较好的方式是在您的 Python 脚本中指定启动器脚本作为 shebang 解释器。Linux 可以处理这个问题,但这是可以配置的,至少有些发行版默认禁用它,而大多数其他 *nix 系统则不能使用它。
如果那种方式不起作用,下一个最好的选择是让用户运行启动器脚本,即告诉他们要做./check.sh
而不是./check.py
,然后check.sh
为用户找到正确的 Python 解释器并运行$python ./check.py
。
如果您想要更加巧妙地解决问题,甚至可以将 Python 脚本嵌入到 shell 脚本中,这样您只需要分发一个文件。他们运行./check.sh
,它会找到正确的 Python 并在 heredoc 上运行。
python
,只需执行ln python3 python
就更好了。 - xielingyun2to3
工具来实现,但最终可能意味着运行两个不同的Python脚本。
python
,那将是2.x;在一个只有3.x的系统上,它应该是3.x。 - abarnertpython
== Python 3.x,python2
== Python 2.x。 - ackpython
将使用2.x;在只有3.x或同时拥有两者的Arch系统上运行它应该是3.x。只要您编写了兼容双方的代码,它就可以正常工作。 - abarnert