2013-03-22 114 views
0

我想知道如何在Linux系统 上获得已安装的firefox版本,并在安装的版本超过3.6时打印消息。使用python获取Firefox版本

我目前的解决办法是:

from subprocess import Popen, PIPE 
import re 

cmd = 'firefox --version' 
p = Popen(['firefox','--version'], stdout=PIPE, stderr=PIPE) 
stdout, stderr = p.communicate() 

main_version_start = re.search("\d", stdout) 

main_version_end = stdout.index(".",main_version_start.start()) 

main_version = stdout[main_version_start.start():main_version_end] 

print main_version 

通过这种方法,我得到的第一位。点之后的数字也可以做同样的事情。 现在我可以做类似:

if main_version < 4: 
    if sub_version < 6: 
     print "Firefox version is too old" 

有没有得到安装版本的更好的办法?

+0

还有就是'webbrowser'模块,但我不知道在任何版本的支持。 – 2013-03-22 20:12:09

回答

1

试图得到嵌套的比较权利是棘手的......并且没有必要。只要这样做:

if (main_version, sub_version) < (3, 6): 
    print "Firefox version is too old" 

此外,你得到的字符串版本。你几乎肯定希望将它们转换为整数。虽然这是真的(在2.x)'2' < 3,但也是如此,'4' < 3。 (而且,虽然你可以通过比较'3'代替3解决特定的问题,这也确实'11' < '3'。)

同时,使用正则表达式时,它通常更易于使用捕捉组使用比开始和结束值,正如jedwards解释的那样。

当然,你可能想要一些错误处理。在完全没有Firefox的系统上,您的Popen调用将引发一个OSError

作为边注,对于前两个版本的组件的标准术语是majorminor,不mainsub

无论如何,把它所有(与shantanoo的简单subprocess调用)在一起:

def firefox_36_or_later(): 
    try: 
     output = subprocess.check_output(['firefox', '--version']) 
    except Exception as e: 
     print "Failed to run Firefox: {}".format(e) 
     return False 
    try: 
     major, minor = map(int, re.search(r"(\d+).(\d+)", output).groups()) 
    except Exception as e: 
     print "Failed to parse '{}' for version number: {}".format(output, e) 
     return False 
    if (major, minor) < (3, 6): 
     print "Firefox version is too old" 
     return False 
    return True 
0

因此,版本3.9将通过“sub_version < 6”。你应该检查一下版本大于:)

若要安装的版本,我看不出有什么更好的办法......也许检查From command line, how to know which Firefox version is installed in windows/linux?

+0

那个链接并没有告诉他任何比他已经知道的更多的东西。它建议使用'-v'而不是'--version',但这绝对不是一种改进。它也显示了Windows的解决方法,但他只关心Linux。 – abarnert 2013-03-22 20:33:44

1

我想不出更好的方式来获取版本,但分析其输出的一个更好的方法可能是相反,:

main_version_start = re.search("\d", stdout) 

main_version_end = stdout.index(".",main_version_start.start()) 

main_version = stdout[main_version_start.start():main_version_end] 

喜欢的东西

(v1,v2,v3) = re.search("(\d+).(\d+).(\d+)", stdout).group(1,2,3) 

在我的无头的系统我得到“是Mozilla Firefox 15.0.1”这被解析为

# v1: 15 
# v2: 0 
# v3: 1 
+0

另一种方法可能是:version = tuple([int(x)for stdout.strip()。split('。')]) – 2013-03-22 20:19:50

+0

@JimDennis:这会引发一个异常,因为'stdout'通常是如“Mozilla Firefox 3.6.18”或“Mozilla Firefox 3.6.18,Copyright(c)1998 - 2010 mozilla.org”;无论哪种方式,你都会尝试做'int(“Mozilla Firefox 3”)。 – abarnert 2013-03-22 20:24:22

1

而不是使用POPEN和PIPE的,你可以使用check_output。

>>> import subprocess 
>>> output = subprocess.check_output(['firefox', '--version']) 

解析Mac的输出:

>>> tuple(map(int, output.split()[-1].split(b'.'))) > (4, 6) 
True 

对于Linux的

>>> tuple(map(int, output.split()[2][:-1].split(b'.')))[:-1] > (4, 6) 
+0

'subprocess.check_output'是一个不错的改进,但分割逻辑是错误的。鉴于''Mozilla Firefox 3.6.13,Copyright(c)1998 - 2010 mozilla.org“','split()[ - 1]'将返回mozilla.org,'split('。')'will返回''mozilla“,”org“',并将'int'映射到这将引发'ValueError'。 – abarnert 2013-03-22 20:27:32

+0

@abarnert谢谢。我在Mac上查看输出。 – shantanoo 2013-03-22 20:37:40

+1

我不认为这个问题是Mac与Linux,但是3.6.x与更新的东西。 (我相信这个变化要么在1.9.2/3.6和2.0/5.0之间,要么在2.0/5.0和6.0之间。) – abarnert 2013-03-22 20:50:13