用Python获取Firefox版本
我想知道怎么在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
错误。
顺便提一下,前两个版本组件的标准术语是major
和minor
,而不是main
和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