0

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

15

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

5 ответ(ов)

0

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

Вот пример кода для Python 2 с pip < 10:

import pip, os, time

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

Для более новых версий (проверялось на Python 3.7 и setuptools 40.8, которые используют 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))))

Для актуальных версий (тестировалось на Python 3.11, использующем importlib.metadata вместо устаревшего pkg_resources):

from importlib.metadata import distributions  
import os, time

for dist in distributions():
    print("%s %s: %s" % (dist.metadata["Name"], dist.version, time.ctime(os.path.getctime(dist._path))))

Вывод будет выглядеть как numpy 1.26.2: Sat Dec 30 16:23:13 2023 в каждом случае.

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

0

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

Вот лучший подход, который я смог придумать:

#!/usr/bin/env python
# Выводит, когда были установлены пакеты Python
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))

Этот скрипт позволяет вам вывести время установки всех установленных пакетов Python. Он проходит по всем установленным пакетам, пытается определить путь к ним и получает время последнего изменения. Результат сортируется и выводится в удобном формате. Если возникают ошибки при получении пути, он использует запасные варианты для определения местоположения пакета.

0

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

В данном решении происходит импорт необходимых модулей и используется метод get_installed_distributions для получения установленных пакетов. Для каждого пакета выводится его имя и время, когда он был установлен, с помощью os.path.getctime.

**Решение 2 : packages.alt.date.py 😗*

#!/usr/bin/env python
# Печатает время установки python-пакетов
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 версии 10.x
  • Поддержка Python версий 2, 2.7, 3, 3.5, 3.7
0

Я не знаю всех опций 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

и так далее.

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

pip --help
pip list --help
pip show --help
и так далее.
0

Команда pip freeze предоставляет список всех установленных пакетов в вашем окружении Python. Если вам нужно узнать, когда конкретный пакет был установлен или обновлён, вы можете воспользоваться модулем os для получения времени создания файла пакета.

Предположим, что вы знаете путь к папке, где установлен пакет. Вы можете использовать следующий код:

import os
import time

# Укажите путь к файлу пакета, например:
file = '/path/to/your/package.egg-info/PKG-INFO'

# Получаем время создания файла
creation_time = time.ctime(os.path.getctime(file))

print(f'Время создания файла: {creation_time}')

Этот код вернёт время создания файла, которое может служить индикатором даты установки или обновления пакета. Не забудьте заменить '/path/to/your/package.egg-info/PKG-INFO' на реальный путь к нужному файлу пакета!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь