首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在脚本中,我怎么可能有不止一种可能性呢?

在脚本中,我怎么可能有不止一种可能性呢?
EN

Unix & Linux用户
提问于 2013-02-26 20:40:52
回答 1查看 12.2K关注 0票数 20

我有一个有趣的情况,我有一个Python脚本,理论上可以由各种不同环境(和路径)的用户在各种Linux系统上运行。我希望这个脚本能够在尽可能多的情况下被执行,而不需要人为的限制。以下是一些已知的设置:

  • python2.6是系统python版本,因此Python、python2和python2.6都存在于/usr/bin中(并且是等效的)。
  • Python2.6是系统Python版本,如前所述,但是python2.7作为python2.7安装在它旁边。
  • Python2.4是系统Python版本,我的脚本不支持这个版本。在/usr/bin中,我们有等效的python、python2和python2.4,以及脚本支持的python2.5。

我希望在所有这三个文件上运行相同的可执行python脚本。如果它首先尝试使用/usr/bin/python2.7,如果它存在,然后回到/usr/bin/python2.6,然后回到/usr/bin/python2.5 2.5,那么如果没有任何一个,那么最好是使用/usr/bin/python2.7。不过,只要它能找到一个正确的口译员,我就不会用最新的2.x来挂掉它。

我的第一种倾向是改变这条支线,从:

代码语言:javascript
复制
#!/usr/bin/python

代码语言:javascript
复制
#!/usr/bin/python2.[5-7]

因为这在bash很管用。但是,运行脚本会给出:

代码语言:javascript
复制
/usr/bin/python2.[5-7]: bad interpreter: No such file or directory

好的,我尝试以下方法,它也适用于bash:

代码语言:javascript
复制
#!/bin/bash -c /usr/bin/python2.[5-7]

但是,这同样失败了,因为:

代码语言:javascript
复制
/bin/bash: - : invalid option

好的,显然我可以编写一个单独的shell脚本,它可以找到正确的解释器,并使用它找到的任何解释器运行python脚本。我只是觉得分发两个文件很麻烦,只要一个文件安装了最新的python 2解释器就足够了。要求人们显式地调用解释器(例如,$ python2.5 script.py)不是一种选择。依靠用户的路径设置某种方式也不是一种选择。

编辑:

Python脚本中的版本检查将不起作用,因为我使用的是在Python2.6中存在的" with“语句(from __future__ import with_statement可以在2.5中使用)。这会导致脚本在用户不友好的SyntaxError上立即失败,并阻止我有机会先检查版本并发出适当的错误。

示例:(使用小于2.6的Python解释器尝试此操作)

代码语言:javascript
复制
#!/usr/bin/env python

import sys

print "You'll never see this!"
sys.exit()

with open('/dev/null', 'w') as out:
    out.write('something')
EN

回答 1

Unix & Linux用户

发布于 2013-02-26 23:30:03

当您的需求声明了一个已知的二进制文件列表时,您可以使用下面的Python来完成它。它不会超过一位数的Python的次要/主要版本,但我认为这种情况不会在短期内发生。

运行位于磁盘上的最高版本,如果二进制上标记的版本高于当前版本的python正在执行的版本,则增加版本的pythons列表。“版本的有序增长列表”是这段代码的重要部分。

代码语言:javascript
复制
#!/usr/bin/env python
import os, sys

pythons = [ '/usr/bin/python2.3','/usr/bin/python2.4', '/usr/bin/python2.5', '/usr/bin/python2.6', '/usr/bin/python2.7' ]
py = list(filter( os.path.isfile, pythons ))
if py:
  py = py.pop()
  thepy = int( py[-3:-2] + py[-1:] )
  mypy  = int( ''.join( map(str, sys.version_info[0:2]) ) )
  if thepy > mypy:
    print("moving versions to "+py)
    args = sys.argv
    args.insert( 0, sys.argv[0] )
    os.execv( py, args )

print("do normal stuff")

为我抓狂的蟒蛇道歉

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/66210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档