Редактировать: Удалить поиск пипса
Спасибо за несколько предложений. Вот новая версия, которая не использует, 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. Улучшение будет заключаться в том, чтобы программно получить последнюю версию и сделать прямое сравнение.