用Python获取Firefox版本

0 投票
4 回答
2461 浏览
提问于 2025-04-17 20:01

我想知道怎么在Linux系统上获取安装的Firefox版本,并且如果这个版本低于3.6,就打印一条消息。

我现在的解决办法是:

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"

有没有更好的方法来获取安装的版本呢?

4 个回答

1

你可以用check_output来代替popen和PIPE。

>>> 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)
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
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

撰写回答