2013-01-04 55 views
5

我有数千个服务器(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

+1

确定...只要你使用两种语言的结构... –

+0

问题是如何写第一行#/ usr/bin/env python [2.x | 3.x] to找到解释器 – xielingyun

+0

为什么这是一个问题?只要运行'python';在只有2.x的系统上,或者在2.x和3.x下都是2.x;在只有3.x的系统上,它应该是3.x. – abarnert

回答

13

许多脚本都可以在2.x和3.x上运行。 (我有一群我每天工作,并已将各种开源库从2.x转换为双版本。)

有几件事情使它更容易:

  • 对于2.x用户,要求2.7或至少2.6+。否则,例如,您不能使用参数引发异常或将其捕获到变量以及其他此类严重限制中。
  • 对于3.x用户,要求3.3+或至少3.2+。大部分无用的不兼容性(如u前缀被拿走)在3.2或3.3中被逆转。
  • 使用six库。
  • 使用__future__声明。
  • 始终在你的脑袋一下是否意味着bytes(只有8位),unicode(必须编码,如果你想8位),或str(无论大部分STDLIB的API的预期),以及encodedecode清晰必要。
  • 在您的代码上定期运行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不能保证在第一工作场所...您可以在事实数着:

  • 在几乎任何系统平台/发行仅提供2.X,python是Python的2
  • 在几乎任何系统平台/发行耗材两者python是Python的2
  • 在几乎任何系统平台/ d istro供应只有3。X(目前是非常罕见的,但可能最终会更常见),python是Python 3的

但是:

  • 在系统中,如果平台供应既不,如果管理员只有安装3.x,它可能会(截至2013年初)而不是可用作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上运行它。

+0

thx,我只是想这样做,但它不是我的问题,我认为运行python3只能使用#!/ usr/bin/env python3,错误 – xielingyun

+0

@xielingyun:最流行的平台或者只安装2 .x或者同时安装。但是也有一些系统不兼容 - 正如我所说的,如果管理员只安装3.x(特别是如果他从python.org安装而不是使用distro软件包),它可能不会作为'python '。这对你来说是一个严重的问题吗?如果是这样,你究竟处理了哪个平台? – abarnert

+0

@xielingyun:我编辑了答案,并提供了一些有关该案例的一般性帮助,但正如我所说的,它不适用于所有平台。 – abarnert

0

考虑到Python 3.x都有不完全后向兼容的Python 2.x的兼容,必须确保脚本与两个版本兼容。这可以通过2to3工具的帮助完成,但最终可能意味着运行两个不同的Python脚本。