編集:ピップ検索を削除
いくつかの提案をありがとう。これは、 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
に返されます。バージョン部分文字列のみをチェックするため、これは最善の解決策ではないかもしれませんが、すべてのパッケージをチェックするよりも高速です。現在インストールされているバージョンが であるが最新バージョンがまたは プログラムで最新バージョンを取得し、直接比較することで改善できます。True
False
if d[name] in s.decode():
pip list --outdated
True
0.2.3
0.2.30
0.2.3a