Как вы проверяете, является ли пакет в его последней версии программно в скрипте и возвращаете истину или ложь?
Я могу проверить с помощью сценария, как это:
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?
pip
не имеет API. Возможно, вы захотите посмотретьpip-api
проект, но там еще немногое.Ответы:
Быстрая версия (только проверка пакета)
Код ниже вызывает пакет с недоступной версией вроде
pip install package_name==random
. Вызов возвращает все доступные версии. Программа читает последнюю версию.Затем программа запускается
pip show package_name
и получает текущую версию пакета.Если он находит совпадение, он возвращает True, иначе False.
Это надежный вариант, учитывая, что он стоит на
pip
Следующий код требует
pip list --outdated
:источник
if (boolean): return True else: return False
лучше простоreturn boolean
pip install p==0
например).random
я уверен, что нет случайной версииМой проект
johnnydep
имеет эту функцию.В ракушке:
В Python:
источник
Редактировать: Удалить поиск пипса
Спасибо за несколько предложений. Вот новая версия, которая не использует,
pip search
но вместо этого извлекает последнюю версию прямо изpypi
предложенного Дэниэлом Хиллом . Это также решает проблему с ложными совпадениями подстроки.Оригинальный ответ
Вот быстрое решение, которое извлекает информацию о последней версии только
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
. Улучшение будет заключаться в том, чтобы программно получить последнюю версию и сделать прямое сравнение.источник
pip search
. Он использует устаревший API-интерфейс XML-RPC, и иногда результаты поиска являются неточными / неправильными. На самом деле, я думаю, что он может быть скоро удален, см. Раздел Удаление команды поиска pip # 5216 .import gekko
аcurrent_version=gekko.__version__
не создавать словарь всех версий пакета. Однако не все пакеты имеют номер версии, доступный в пакете.Последняя версия:
Мой проект
luddite
имеет эту функцию:Установленная версия:
Канонический способ проверить установленную версию - просто получить доступ к
__version__
атрибуту пространства имен верхнего уровня:К сожалению, не все проекты устанавливают этот атрибут. Когда они этого не делают, вы можете использовать их
pkg_resources
для метаданных:источник
Это должно помочь, по крайней мере, в демонстрационных целях. Просто позвоните
isLatestVersion
с названием пакета, который вы хотели бы проверить. Если вы используете это где-то важное, вы можете попробовать / поймать URL-запрос, так как доступ в Интернет может быть недоступен. Также обратите внимание, что если пакет не установленisLatestVersion
, вернется False.Это проверено на Python 3.7.4 и Pip 19.0.3.
источник
pip._internal
не является публичным API. Это даже явно не рекомендуется в документах pip : « Вы не должны использовать внутренние API pip таким образом ».Нетрудно написать простой скрипт, обратившись к PyPI API . В последнем Python 3.8 можно использовать только стандартную библиотеку (при использовании Python 3.7 или более ранней версии вам необходимо установить
importlib_metadata
бэкпорт):Пример использования:
Если вы случайно
packaging
установили, это лучшая альтернативаdistutils.version
для анализа версии:становится
источник