1

我想知道如何在 linux 系统上获取已安装的 firefox-version 并在安装的版本早于 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

4 回答 4

2

试图正确地进行嵌套比较是很棘手的……而且是不必要的。只需这样做:

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.

作为旁注,前两个版本组件的标准术语是majorand minor,而不是mainand sub

无论如何,将它们放在一起(使用 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
于 2013-03-22T20:19:01.147 回答
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
于 2013-03-22T20:15:49.277 回答
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)
于 2013-03-22T20:22:08.863 回答
0

这样,3.9 版将通过“sub_version < 6”。您应该检查版本是否大于:)

要获得安装版本,我没有看到任何更好的方法......也许检查从命令行,如何知道在 windows/linux 中安装了哪个 Firefox 版本?

于 2013-03-22T20:09:15.650 回答