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

xie*_*yun 6 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

aba*_*ert 14

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

一些事情使它变得容易:

  • 2.x用户需要2.7或至少2.6+.否则,例如,您不能使用参数引发和异常或将它们捕获到变量中,以及其他此类严重限制.
  • 3.x用户需要3.3+或至少3.2+.大多数无偿的不兼容性(如u前缀被带走)在3.2或3.3中被颠倒过来.
  • 使用六个库.
  • 使用__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
Run Code Online (Sandbox Code Playgroud)

这不能保证工作 - 但env不能保证在第一位工作......你可以依靠以下事实:

  • 几乎所有平台/发行版仅提供2.x的系统python都是Python 2.
  • 几乎所有平台/发行版都提供的系统都是pythonPython 2.
  • 几乎所有平台/发行版仅提供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上运行它.