1

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

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.

補足として、最初の 2 つのバージョン コンポーネントの標準用語はmajorandであり、 andではありminorません。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
于 2013-03-22T20:19:01.147 に答える
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)
于 2013-03-22T20:22:08.863 に答える
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 に答える
0

これにより、バージョン 3.9 は「sub_version < 6」を渡します。バージョンがより大きいかどうかを確認する必要があります:)

インストールされているバージョンを取得するには、これ以上の方法はありません...コマンドラインから、windows/linux にインストールされている Firefox のバージョンを確認する方法を確認してください。

于 2013-03-22T20:09:15.650 に答える