我有成千上万的服务器(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转换为双版本.)
一些事情使它变得容易:
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
Run Code Online (Sandbox Code Playgroud)
这不能保证工作 - 但env不能保证在第一位工作......你可以依靠以下事实:
python都是Python 2.pythonPython 2.python是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上运行它.