可以使用python 2.x和python 3.x运行一个python脚本

时间:2013-01-04 06:55:54

标签: python python-3.x

我有成千上万的服务器(linux),有些只有python 2.x而有些只有python 3.x,我想写一个脚本check.py可以在所有服务器上运行,就像$。/ check.py一样不使用$ python check.py或$ python3 check.py,有没有办法做到这一点?

我的问题是脚本check.py如何找到解释器,无论解释器是python2.x还是python3.x

3 个答案:

答案 0 :(得分:14)

许多脚本可以在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.pyif sys.version_info >= (3, 0):执行2to3步骤。)

从你的编辑中,听起来你最关心的是放在#中的内容!线。为此:

/usr/bin/env python

这不能保证工作 - 但是env不能保证在第一位工作......你可以指望这样的事实:

  • 对于平台/发行版仅提供2.x的任何系统,python是Python 2。
  • 对于平台/发行版同时提供这两者的任何系统,python是Python 2。
  • 几乎所有平台/发行版仅提供3.x的系统(目前非常罕见,但最终可能更常见),python是Python 3。

然而:

  • 在平台提供 的系统上,如果管理员仅安装了3.x,则可能(截至2013年初)可用{{ 1}}。关于这一点,你无能为力。

如果最后一个是严重问题,您可以通过添加一个用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兼容性但仍受其支持的维护人员现在将松一口气,并且常常会非常乐意为以后的开发工作插上插头。