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