¿Cómo verifica si un paquete está en su última versión mediante programación en un script y devuelve verdadero o falso?
Puedo verificar con un 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'])
o con línea de comando:
(base) C:\User>pip search gekko
gekko (0.2.3) - Machine learning and optimization for dynamic systems
INSTALLED: 0.2.3 (latest)
Pero, ¿cómo verifico mediante programación y devuelvo verdadero o falso?

pipno tiene una API Es posible que desee ver elpip-apiproyecto, pero aún no hay mucho allí.Respuestas:
Versión rápida (solo verificando el paquete)
El siguiente código llama al paquete con una versión no disponible como
pip install package_name==random. La llamada devuelve todas las versiones disponibles. El programa lee la última versión.El programa se ejecuta
pip show package_namey obtiene la versión actual del paquete.Si encuentra una coincidencia, devuelve Verdadero, de lo contrario, Falso.
Esta es una opción confiable dado que está en pie
pipEl siguiente código requiere
pip list --outdated:fuente
if (boolean): return True else: return Falselo general, es mejor soloreturn booleanpip install p==0por ejemplo).randomEstoy seguro de que no hay una versión aleatoriaMi proyecto
johnnydeptiene esta característica.Con cáscara:
En Python:
fuente
Editar: Eliminar búsqueda de pip
Gracias por las varias sugerencias. Aquí hay una nueva versión que no usa,
pip searchsino que extrae la última versión directamente de lapypipropuesta de Daniel Hill . Esto también resuelve el problema con las coincidencias falsas de la subcadena.Respuesta original
Aquí hay una solución rápida que recupera la información de la última versión solo del
gekkopaquete de interés.Esto produce el mensaje
Latest version (0.2.3) of gekko is installedy vuelveTruea indicar la última versión (oFalsesi no la última versión). Puede que esta no sea la mejor solución porque solo verifica una subcadena de versión,if d[name] in s.decode():pero es más rápida que lapip list --outdatedque verifica todos los paquetes. Este no es el método más confiable porque devolverá un errorTruesi la versión actual instalada es0.2.3pero la última versión es0.2.30o0.2.3a. Una mejora sería obtener mediante programación la última versión y hacer una comparación directa.fuente
pip search. Utiliza una API XML-RPC en desuso y, a veces, los resultados de búsqueda son inexactos / incorrectos. De hecho, creo que podría eliminarse pronto, consulte Eliminar el comando de búsqueda pip # 5216 .import gekkoy luego, encurrent_version=gekko.__version__lugar de crear un diccionario de todas las versiones del paquete. Sin embargo, no todos los paquetes tienen un número de versión accesible en el paquete.Ultima versión:
Mi proyecto
ludditetiene esta característica:Versión instalada:
La forma canónica de verificar la versión instalada es simplemente acceder al
__version__atributo del espacio de nombres de nivel superior:Lamentablemente, no todos los proyectos establecen este atributo. Cuando no lo hacen, puede usar
pkg_resourcespara extraerlo de los metadatos:fuente
Esto debería hacer el truco al menos para fines de demostración. Simplemente llame
isLatestVersioncon el nombre del paquete que desea verificar. Si está utilizando esto en algún lugar importante, querrá probar / capturar la solicitud de URL, ya que es posible que el acceso a Internet no esté disponible. También tenga en cuenta que si el paquete no está instaladoisLatestVersion, devolverá False.Esto se prueba para Python 3.7.4 y Pip 19.0.3.
fuente
pip._internalNo es API pública. Incluso se desaconseja explícitamente en los documentos de pip : " no debe utilizar las API internas de pip de esta manera ".No es difícil escribir un script simple usted mismo consultando la API PyPI . Con la última versión de Python 3.8, es posible usar solo la biblioteca estándar (cuando se usa Python 3.7 o anterior, tendrá que instalar el
importlib_metadatabackport):Ejemplo de uso:
Si tiene
packaginginstalado, es una mejor alternativadistutils.versionpara el análisis de versiones:se convierte
fuente