Подтвердить что ты не робот

См., Когда пакеты были установлены/обновлены с помощью pip

Я знаю, как видеть установленные пакеты Python с помощью pip, просто используйте pip freeze. Но есть ли способ увидеть дату и время, когда пакет установлен или обновлен с помощью pip?

4b9b3361

Ответ 1

Если нет необходимости отличаться от обновленного и установленного, вы можете использовать время изменения файла пакета. Например:

import pip, os, time

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

Btw: вместо pip freeze вы можете использовать pip list, который может предоставить дополнительную информацию, например, устаревшие пакеты через pip list -o.

Ответ 2

К сожалению, упаковка python делает это немного сложнее, поскольку нет постоянного места, где перечислены файлы пакетов или каталоги модулей.

Вот лучшее, что я придумал:

#!/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))

Ответ 3

Я не знаю всех параметров pip, но для одного модуля вы можете получить список его файлов
а затем вы можете проверить его даты с помощью python или bash.

Например, список файлов в модуле requests

pip show --files requests

результат:

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.

BTW: вы можете использовать --help, чтобы увидеть больше параметров для некоторых функций

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

Ответ 4

Вы можете использовать опцию --log:

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

например:

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

Или вы можете установить его в своем pip.conf для включения по умолчанию:

[global]
log = <path>

Затем все операции pip будут корректно записываться в указанный файл вместе с разделителем и меткой журнала, например:

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

записывает следующее в ~/.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...

Вы можете проанализировать, что вам нужно из этого журнала. В то время как не самый приятный это стандартный объект pip.

Ответ 5

Решение 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)))

Решение 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))

Совместимость решений 1 и 2:

  • обновленное решение для pip v10.x
  • python v2, v2.7, v3, v3.5

Ответ 6

pip freeze предоставляет вам все установленные пакеты. Предполагая, что вы знаете папку:

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

должно указывать время создания файла, то есть дату, когда пакет был установлен или обновлен.