42

パッケージがスクリプトでプログラムによって最新バージョンであるかどうかを確認し、true または false を返すにはどうすればよいですか?

次のようなスクリプトで確認できます。

package='gekko'
import pip
if hasattr(pip, 'main'):
    from pip import main as pipmain
else:
    from pip._internal import main as pipmain
pipmain(['search','gekko'])

またはコマンドラインで:

(base) C:\User>pip search gekko
gekko (0.2.3)  - Machine learning and optimization for dynamic systems
  INSTALLED: 0.2.3 (latest)

しかし、プログラムでチェックして true または false を返すにはどうすればよいでしょうか?

4

8 に答える 8

2

編集:ピップ検索を削除

いくつかの提案をありがとう。これは、 Daniel Hillによって提案されているように、使用せずpip searchに最新バージョンを直接プルする新しいバージョンです。これにより、部分文字列の誤った一致の問題も解決されます。pypi

def check(name):
    import subprocess
    import sys
    import json
    import urllib.request

    # create dictionary of package versions
    pkgs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
    keys = [p.decode().split('==')[0] for p in pkgs.split()]
    values = [p.decode().split('==')[1] for p in pkgs.split()]
    d = dict(zip(keys, values)) # dictionary of all package versions

    # retrieve info on latest version
    contents = urllib.request.urlopen('https://pypi.org/pypi/'+name+'/json').read()
    data = json.loads(contents)
    latest_version = data['info']['version']

    if d[name]==latest_version:
        print('Latest version (' + d[name] + ') of '+str(name)+' is installed')
        return True
    else:
        print('Version ' + d[name] + ' of '+str(name)+' not the latest '+latest_version)
        return False

print(check('gekko'))

元の応答

gekko対象のパッケージのみの最新バージョン情報を取得する高速なソリューションを次に示します。

def check(name):
    import subprocess
    import sys
    # create dictionary of package versions
    pkgs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
    keys = [p.decode().split('==')[0] for p in pkgs.split()]
    values = [p.decode().split('==')[1] for p in pkgs.split()]
    d = dict(zip(keys, values)) # dictionary of all package versions

    # retrieve info on latest version
    s = subprocess.check_output([sys.executable, '-m', 'pip', 'search', name])

    if d[name] in s.decode():  # weakness
        print('Latest version (' + d[name] + ') of '+str(name)+' is installed')
        return True
    else:
        print(s.decode())
        return False

print(check('gekko'))

これによりメッセージが生成され、最新バージョン (または最新バージョンでない場合) を示すためLatest version (0.2.3) of gekko is installedに返されます。バージョン部分文字列のみをチェックするため、これは最善の解決策ではないかもしれませんが、すべてのパッケージをチェックするよりも高速です。現在インストールされているバージョンが であるが最新バージョンがまたは プログラムで最新バージョンを取得し、直接比較することで改善できます。TrueFalseif d[name] in s.decode():pip list --outdatedTrue0.2.30.2.300.2.3a

于 2019-10-31T19:12:03.057 に答える