2017-08-19 8 views
1

いずれかが、私はPythonは回転数をチェックするためには、より大きなバージョン

コマンド以下のrpmバージョンを満たすためにLinuxの中でチェックするのに役立つ可能性があり、私はパッケージのバージョンを取得するために使用されます。サブプロセスを使用して

rpm -qi libstdc++6 | awk -F': ' '/Version/ {print $2}' 

、私は

6.2.1+r239768 

を入れて、以下の取得今私は6.2.1+r239768を比較したい5.1.1以下

は私が

output = 6.2.1+r239768 
print "This rpm version is supported" 
output = 6.3+r23 
print "This rpm version is supported" 
output = 7.1.1+r57678 
print "This rpm version is supported" 
output = 5.1.1+r23677 
print "This rpm version is not supported" 
output = 4.1+r56888 
print "This rpm version is not supported" 

答えて

2
期待していた結果であるよりも大きいです

pkg_resourcesモジュールを使用してください

In []: 
from pkg_resources import parse_version 
parse_version('6.2.1+r239768') > parse_version('5.1.1') 

Out[]: 
True 

だからあなたの出力を得るために:

In []: 
versions = ['6.2.1+r239768', '6.3+r23', '7.1.1+r57678', '5.1.1+r23677', '4.1+r56888'] 
base = parse_version('6.2.1+r239768') 
for v in versions: 
    print("Output = {}".format(v)) 
    print("This rpm version is {}supported".format('not ' if parse_version(v) < base else '')) 

Out[]: 
Output = 6.2.1+r239768 
This rpm version is supported 
Output = 6.3+r23 
This rpm version is supported 
Output = 7.1.1+r57678 
This rpm version is supported 
Output = 5.1.1+r23677 
This rpm version is not supported 
Output = 4.1+r56888 
This rpm version is not supported 
+0

parse_versionをインポートせずに同じことを達成する方法はありますか?このモジュールを持っていないマシンはほとんどありません。 –

+0

古いバージョンのPythonが必要です。これらのバージョンは、デフォルトでは 'Py2.7.9 +'と 'Py3.4 +'になっています。あなたは 'pkg_resource'のコードを見ることができます。あるいは、 'pip'パッケージをインストールするだけです。' yum install python-pip'です。 – AChampion

+0

私はPython 2.7を使用していますが、私たちはモジュールをインストールすることはできませんし、Pythonの新しいバージョンをアップグレードすることはできません。私たちはデフォルトモジュールとpython2.7を使用しなければなりません –

1

あなたがpython API for rpmを使用しての良いはずのように私は感じていることがsetuptoolsの一部であるとしてADYを持っています。

私はRPMベースのシステムを手元に持っていないので、コードを思い付くことができませんでした。コード、taken from Section 16.5後、それに応じて

#!/usr/bin/python 
# Reads in package header, compares to installed package. 
# Usage: 
# python vercompare.py libstdc++6.rpm 
# 
import os 
import sys 

import rpm 
def readRpmHeader(ts, filename): 
    """ Read an rpm header. """ 
    fd = os.open(filename, os.O_RDONLY) 
    try: 
     h = ts.hdrFromFdno(fd) 
    finally: 
     os.close(fd) 
    return h 

ts = rpm.TransactionSet() 
h = readRpmHeader(ts, sys.argv[1]) 
pkg_ds = h.dsOfHeader() 
for inst_h in ts.dbMatch('name', h['name']): 
    inst_ds = inst_h.dsOfHeader() 
    if pkg_ds.EVR() >= inst_ds.EVR(): 
     print "Package file is same or newer, OK to upgrade." 
    else: 
     print "Package file is older than installed version." 
1

$ rpmdev-vercmp 6.2.1+r239768 6.3+r23 6.2.1+r239768 < 6.3+r23

を適合させることができる

あなたは終了コード読むことができます:EVRさんが等しい場合、終了ステータスが0である rpmdev-vercmp <EVR1> <EVR2>

を、11であればEVR1は新しいもので、EVR2の場合は が新しいものは12です。他の終了ステータスは問題を示します。

0

python rpmライブラリは、EVR(Epoch、Version、Release)を比較する方法を提供しますが、文字列をそれらの部分に分割するコードはありません。しかし、それは簡単です。ここに少し働くプログラムがあります。

#! /usr/bin/env python 

import re 
import sys 

import rpm 

evr_re = re.compile(r'^(?:([^:]*):)?([^-]+)(?:-(.*))?$') 


def str_to_evr(s): 
    mo = evr_re.match(s) 
    if not mo: 
     raise ValueError("not a valid version string") 
    return mo.groups() 


def main(): 
    if len(sys.argv) != 3: 
     raise SystemExit("usage: vercmp VER1 VER2") 
    try: 
     evr_a = str_to_evr(sys.argv[1].strip()) 
     evr_b = str_to_evr(sys.argv[2].strip()) 
     result = rpm.labelCompare(evr_a, evr_b) 
    except Exception as exc: 
     raise SystemExit("Problem converting or comparing versions: %s %s" % (
      type(exc).__name__, exc)) 
    print (result) 


if __name__ == "__main__": 
    main() 
関連する問題