Vea cuando los paquetes fueron instalados / actualizados usando pip

Sé cómo ver los paquetes de Python instalados usando pip, solo use pip freeze . Pero, ¿hay alguna forma de ver la fecha y la hora en que se instala o actualiza el paquete con pip?

Si no es necesario diferenciar entre actualizado e instalado, puede usar la hora de cambio del archivo del paquete.

Al igual que para Python 2 con pip <10:

 import pip, os, time for package in pip.get_installed_distributions(): print "%s: %s" % (package, time.ctime(os.path.getctime(package.location))) 

o así para las versiones más nuevas (probadas con Python 3.7 e instaladastotools 40.8 que traen pkg_resources ):

 import pkg_resources, os, time for package in pkg_resources.working_set: print("%s: %s" % (package, time.ctime(os.path.getctime(package.location)))) 

una salida se verá como numpy 1.12.1: Tue Feb 12 21:36:37 2019 en ambos casos.

Por cierto: en lugar de usar la pip freeze , puede usar la pip list que puede proporcionar más información, como paquetes obsoletos a través de la pip list -o .

Desafortunadamente, el empaquetado de Python hace que esto sea un poco complicado, ya que no hay un lugar consistente que indique dónde se ubican los archivos del paquete o los directorios de los módulos.

Aquí está lo mejor que he encontrado:

 #!/usr/bin/env python # Prints when python packages were installed from __future__ import print_function from datetime import datetime import os import pip if __name__ == "__main__": packages = [] for package in pip.get_installed_distributions(): package_name_version = str(package) try: module_dir = next(package._get_metadata('top_level.txt')) package_location = os.path.join(package.location, module_dir) os.stat(package_location) except (StopIteration, OSError): try: package_location = os.path.join(package.location, package.key) os.stat(package_location) except: package_location = package.location modification_time = os.path.getctime(package_location) modification_time = datetime.fromtimestamp(modification_time) packages.append([ modification_time, package_name_version ]) for modification_time, package_name_version in sorted(packages): print("{0} - {1}".format(modification_time, package_name_version)) 

Podrías usar la opción --log :

 --log  Path to a verbose appending log. This log is inactive by default. 

P.ej:

 $ pip install --log ~/.pip/pip.append.log gunicorn 

O puede configurarlo en su pip.conf para que esté habilitado por defecto:

 [global] log =  

Luego, todas las operaciones de pip se registrarán verbalmente en el archivo especificado junto con un separador de registro y una marca de tiempo, por ejemplo:

 $ pip install --log ~/.pip/pip.append.log gunicorn $ pip install --log ~/.pip/pip.append.log --upgrade gunicorn 

registra lo siguiente en ~ / .pip / pip.append.log:

 ------------------------------------------------------------ /usr/bin/pip run on Mon Jul 14 14:35:36 2014 Downloading/unpacking gunicorn ... Successfully installed gunicorn Cleaning up... ------------------------------------------------------------ /usr/bin/pip run on Mon Jul 14 14:35:57 2014 Getting page https://pypi.python.org/simple/gunicorn/ URLs to search for versions for gunicorn in /usr/lib/python2.7/site-packages: * https://pypi.python.org/simple/gunicorn/ ... Requirement already up-to-date: gunicorn in /usr/lib/python2.7/site-packages Cleaning up... 

Podría analizar lo que necesita de este registro. Si bien no es el mejor, es una instalación estándar de pip .

Solución 1: packages.date.py:

 import os import time from pip._internal.utils.misc import get_installed_distributions for package in get_installed_distributions(): print (package, time.ctime(os.path.getctime(package.location))) 

Solución 2: packages.alt.date.py:

 #!/usr/bin/env python # Prints when python packages were installed from __future__ import print_function from datetime import datetime from pip._internal.utils.misc import get_installed_distributions import os if __name__ == "__main__": packages = [] for package in get_installed_distributions(): package_name_version = str(package) try: module_dir = next(package._get_metadata('top_level.txt')) package_location = os.path.join(package.location, module_dir) os.stat(package_location) except (StopIteration, OSError): try: package_location = os.path.join(package.location, package.key) os.stat(package_location) except: package_location = package.location modification_time = os.path.getctime(package_location) modification_time = datetime.fromtimestamp(modification_time) packages.append([ modification_time, package_name_version ]) for modification_time, package_name_version in sorted(packages): print("{0} - {1}".format(modification_time, package_name_version)) 

Compatibilidad con soluciones 1 y 2:

  • Solución actualizada para pip v10.x
  • Python v2, v2.7, v3, v3.5

No conozco todas pip opciones de pip , pero para un módulo puede obtener una lista de sus archivos
y luego puedes verificar sus fechas usando python o bash.

Por ejemplo, lista de archivos en el módulo de requests

 pip show --files requests 

resultado:

 Name: requests Version: 2.2.1 Location: /usr/local/lib/python2.7/dist-packages Requires: Files: ../requests/hooks.py ../requests/status_codes.py ../requests/auth.py ../requests/models.py etc. 

Por cierto: puedes usar – --help para ver más opciones para algunas funciones

 pip --help pip list --help pip show --help etc. 

Recientemente estuve buscando esto también. Pero aunque hay muchas respuestas buenas aquí, el problema real es que dado que pip no mantiene registros de forma predeterminada, tenemos que recurrir al uso de los tiempos de creación y modificación de archivos, conocidos como ctime y mtime , respectivamente. (Ver tiempos de MAC ). Desafortunadamente, el uso de este método tiene dos efectos secundarios:

  1. Diferentes sistemas operativos y sistemas operativos manejan el ctime / mtime de manera diferente (si está disponible)
  2. Las instalaciones de Python utilizan muchos directorios diferentes, y algunos permanecen después de las instalaciones, mientras que otros se crean sobre la marcha cuando se ejecutan. Haciendo difícil saber exactamente en qué archivos verificar las fechas.

Sin embargo, hay una herramienta llamada pip-date que intenta combinar algunos métodos diferentes.

pip install pip-date


introduzca la descripción de la imagen aquí

pip freeze te da todos los paquetes instalados. Suponiendo que usted conoce la carpeta:

time.ctime(os.path.getctime(file))

debe darle la hora de creación de un archivo, es decir, la fecha en que se instaló o actualizó el paquete.