¿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?
pip
no tiene una API Es posible que desee ver elpip-api
proyecto, 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_name
y 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
pip
El siguiente código requiere
pip list --outdated
:fuente
if (boolean): return True else: return False
lo general, es mejor soloreturn boolean
pip install p==0
por ejemplo).random
Estoy seguro de que no hay una versión aleatoriaMi proyecto
johnnydep
tiene 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 search
sino que extrae la última versión directamente de lapypi
propuesta 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
gekko
paquete de interés.Esto produce el mensaje
Latest version (0.2.3) of gekko is installed
y vuelveTrue
a indicar la última versión (oFalse
si 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 --outdated
que verifica todos los paquetes. Este no es el método más confiable porque devolverá un errorTrue
si la versión actual instalada es0.2.3
pero la última versión es0.2.30
o0.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 gekko
y 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
luddite
tiene 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_resources
para extraerlo de los metadatos:fuente
Esto debería hacer el truco al menos para fines de demostración. Simplemente llame
isLatestVersion
con 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._internal
No 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_metadata
backport):Ejemplo de uso:
Si tiene
packaging
instalado, es una mejor alternativadistutils.version
para el análisis de versiones:se convierte
fuente