Como você verifica se um pacote está na sua versão mais recente programaticamente em um script e retorna um valor verdadeiro ou falso?
Eu posso verificar com um script como este:
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'])
ou com linha de comando:
(base) C:\User>pip search gekko
gekko (0.2.3) - Machine learning and optimization for dynamic systems
INSTALLED: 0.2.3 (latest)
Mas como faço para verificar programaticamente e retornar verdadeiro ou falso?
pip
não possui uma API. Você pode assistir aopip-api
projeto, mas ainda não há muito.Respostas:
Versão Rápida (Verificando apenas o pacote)
O código abaixo chama o pacote com uma versão indisponível como
pip install package_name==random
. A chamada retorna todas as versões disponíveis. O programa lê a versão mais recente.O programa é executado
pip show package_name
e obtém a versão atual do pacote.Se encontrar uma correspondência, retornará True, caso contrário, False.
Esta é uma opção confiável, pois permanece em
pip
O código a seguir pede
pip list --outdated
:fonte
if (boolean): return True else: return False
é melhor apenas parareturn boolean
pip install p==0
por exemplo).random
Estou certo de que não existe uma versão aleatóriaMeu projeto
johnnydep
tem esse recurso.Com casca:
Em Python:
fonte
Editar: Remover pesquisa de pip
Obrigado pelas várias sugestões. Aqui está uma nova versão que não usa,
pip search
mas extrai a versão mais recente diretamente,pypi
conforme proposto por Daniel Hill . Isso também resolve o problema com as correspondências falsas da substring.Resposta original
Aqui está uma solução rápida que recupera as informações da versão mais recente apenas no
gekko
pacote de interesse.Isso produz a mensagem
Latest version (0.2.3) of gekko is installed
e retornaTrue
para indicar a versão mais recente (ouFalse
se não a versão mais recente). Essa pode não ser a melhor solução, pois apenas verifica se há uma substring de versão,if d[name] in s.decode():
mas é mais rápida do quepip list --outdated
isso verifica todos os pacotes. Este não é o método mais confiável, pois retornará um incorretoTrue
se a versão instalada atual for a versão0.2.3
mais recente0.2.30
ou for0.2.3a
. Uma melhoria seria obter programaticamente a versão mais recente e fazer uma comparação direta.fonte
pip search
. Ele usa uma API XML-RPC reprovada e, às vezes, os resultados da pesquisa são imprecisos / incorretos Na verdade, acho que isso poderá ser removido em breve, consulte Remover o comando pip search # 5216 .import gekko
e, emcurrent_version=gekko.__version__
vez de criar um dicionário de todas as versões de pacotes. No entanto, nem todos os pacotes têm um número de versão acessível no pacote.Última versão:
Meu projeto
luddite
tem esse recurso:Versão instalada:
A maneira canônica de verificar a versão instalada é apenas acessar o
__version__
atributo do espaço para nome de nível superior:Infelizmente, nem todos os projetos definem esse atributo. Quando não o fazem, você pode usá
pkg_resources
-lo para extrair os metadados:fonte
Isso deve funcionar, pelo menos para fins de demonstração. Basta ligar
isLatestVersion
com o nome do pacote que você deseja verificar. Se você estiver usando isso em algum lugar importante, convém tentar / capturar a solicitação de URL, pois o acesso à Internet pode não estar disponível. Observe também que, se o pacote não estiver instaladoisLatestVersion
, retornará False.Isso é testado para Python 3.7.4 e Pip 19.0.3.
fonte
pip._internal
não é uma API pública. É até explicitamente desencorajado nos documentos do pip : " você não deve usar as APIs internas do pip dessa maneira ".Não é difícil escrever um script simples consultando a API do PyPI . Com o Python 3.8 mais recente, é possível usar apenas a biblioteca padrão (ao usar o Python 3.7 ou mais antigo, você precisará instalar o
importlib_metadata
backport):Exemplo de uso:
Se você
packaging
instalou, é uma alternativa melhor paradistutils.version
a análise de versão:torna-se
fonte