Comment vérifiez-vous si un package est à sa dernière version par programmation dans un script et retournez un vrai ou un faux?
Je peux vérifier avec un script comme celui-ci:
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 avec la ligne de commande:
(base) C:\User>pip search gekko
gekko (0.2.3) - Machine learning and optimization for dynamic systems
INSTALLED: 0.2.3 (latest)
Mais comment puis-je vérifier par programme et retourner vrai ou faux?
pip
n'a pas d'API. Vous voudrez peut-être regarder lepip-api
projet, mais il n'y en a pas encore beaucoup.Réponses:
Version rapide (vérification de l'emballage uniquement)
Le code ci-dessous appelle le package avec une version non disponible comme
pip install package_name==random
. L'appel renvoie toutes les versions disponibles. Le programme lit la dernière version.Le programme s'exécute ensuite
pip show package_name
et obtient la version actuelle du package.S'il trouve une correspondance, il renvoie True, sinon False.
Il s'agit d'une option fiable étant donné qu'elle repose sur
pip
Le code suivant appelle
pip list --outdated
:la source
if (boolean): return True else: return False
vaut mieux justereturn boolean
pip install p==0
par exemple).random
je suis sûr qu'il n'y a pas de version aléatoireMon projet
johnnydep
a cette fonctionnalité.En coquille:
En Python:
la source
Modifier: Supprimer la recherche pip
Merci pour les nombreuses suggestions. Voici une nouvelle version qui n'utilise pas
pip search
mais tire à la place la dernière version directementpypi
comme proposé par Daniel Hill . Cela résout également le problème avec les fausses correspondances de la sous-chaîne.Réponse originale
Voici une solution rapide qui récupère les informations de dernière version uniquement sur le
gekko
package qui vous intéresse.Cela produit le message
Latest version (0.2.3) of gekko is installed
et retourneTrue
pour indiquer la dernière version (ouFalse
sinon la dernière version). Ce n'est peut-être pas la meilleure solution car il ne vérifie qu'une sous-chaîne de versionif d[name] in s.decode():
mais il est plus rapide quepip list --outdated
cela vérifie tous les packages. Ce n'est pas la méthode la plus fiable car elle retournera une erreurTrue
si la version installée actuelle est0.2.3
mais la dernière version est0.2.30
ou0.2.3a
. Une amélioration serait d'obtenir par programmation la dernière version et de faire une comparaison directe.la source
pip search
. Il utilise une API XML-RPC obsolète, et parfois les résultats de la recherche sont inexacts / incorrects En fait, je pense qu'il pourrait être supprimé bientôt, voir Supprimer la commande de recherche pip # 5216 .import gekko
, puiscurrent_version=gekko.__version__
au lieu de créer un dictionnaire de toutes les versions du package. Cependant, tous les packages n'ont pas un numéro de version accessible dans le package.Dernière version:
Mon projet
luddite
a cette fonctionnalité:Version installée:
La manière canonique de vérifier la version installée consiste simplement à accéder à l'
__version__
attribut de l'espace de noms de niveau supérieur:Malheureusement, tous les projets ne définissent pas cet attribut. Dans le cas contraire, vous pouvez les utiliser
pkg_resources
pour les extraire des métadonnées:la source
Cela devrait faire l'affaire au moins à des fins de démonstration. Appelez simplement
isLatestVersion
avec le nom du colis que vous souhaitez vérifier. Si vous utilisez ceci dans un endroit important, vous voudrez essayer / intercepter la demande d'URL car l'accès Internet peut ne pas être disponible. Notez également que si le package n'est pas installéisLatestVersion
, False sera renvoyé.Ceci est testé pour Python 3.7.4 et Pip 19.0.3.
la source
pip._internal
n'est pas une API publique. Il est même explicitement déconseillé dans les documents de pip : " vous ne devez pas utiliser les API internes de pip de cette manière ".Il n'est pas difficile d'écrire un script simple vous-même en interrogeant l'API PyPI . Avec la dernière version de Python 3.8, il est possible d'utiliser uniquement la bibliothèque standard (lorsque vous utilisez Python 3.7 ou une version antérieure, vous devrez installer le
importlib_metadata
backport):Exemple d'utilisation:
S'il vous arrive d'avoir
packaging
installé, c'est une meilleure alternative à l'distutils.version
analyse de version:devient
la source