我有数千个服务器(linux),一些只有python 2.x,一些只有python 3.x,我想写一个脚本check.py可以在所有服务器上运行,就像$。/ check.py一样,不需要使用$ python check.py或者$ python3 check.py,有没有办法做到这一点?可以使用python 2.x和python 3.x运行一个python脚本
我的问题是脚本check.py如何找到解释无论解释器python2.x和python3.x
我有数千个服务器(linux),一些只有python 2.x,一些只有python 3.x,我想写一个脚本check.py可以在所有服务器上运行,就像$。/ check.py一样,不需要使用$ python check.py或者$ python3 check.py,有没有办法做到这一点?可以使用python 2.x和python 3.x运行一个python脚本
我的问题是脚本check.py如何找到解释无论解释器python2.x和python3.x
许多脚本都可以在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的2python
是Python的2python
是Python 3的但是:
python
。关于这一点你可以做的不多。如果最后一个是一个严重的问题,你可以解决它通过添加一个启动程序脚本,写的SH,试图python
,然后尝试python3
如果失败。
这样做的好方法是将启动脚本本身指定为Python脚本中的shebang解释器。 Linux可以处理这个问题,但它是可配置的,并且至少有一些发行版在默认情况下禁用它 - 而大多数其他的* nix系统不能这样做。
如果还是不行,下一个最好的选择是让用户运行启动脚本,也就是说,告诉他们做./check.sh
而不是./check.py
,并check.sh
数字出正确的Python解释器和用于运行$python ./check.py
用户。
如果你想变得非常棘手,甚至可以将Python脚本作为heredoc嵌入到shell脚本中,所以你只需要分发一个文件。他们运行./check.sh
,它找到正确的Python并在heredoc上运行它。
thx,我只是想这样做,但它不是我的问题,我认为运行python3只能使用#!/ usr/bin/env python3,错误 – xielingyun
@xielingyun:最流行的平台或者只安装2 .x或者同时安装。但是也有一些系统不兼容 - 正如我所说的,如果管理员只安装3.x(特别是如果他从python.org安装而不是使用distro软件包),它可能不会作为'python '。这对你来说是一个严重的问题吗?如果是这样,你究竟处理了哪个平台? – abarnert
@xielingyun:我编辑了答案,并提供了一些有关该案例的一般性帮助,但正如我所说的,它不适用于所有平台。 – abarnert
考虑到Python 3.x都有不完全后向兼容的Python 2.x的兼容,必须确保脚本与两个版本兼容。这可以通过2to3
工具的帮助完成,但最终可能意味着运行两个不同的Python脚本。
确定...只要你使用两种语言的结构... –
问题是如何写第一行#/ usr/bin/env python [2.x | 3.x] to找到解释器 – xielingyun
为什么这是一个问题?只要运行'python';在只有2.x的系统上,或者在2.x和3.x下都是2.x;在只有3.x的系统上,它应该是3.x. – abarnert