Посмотреть, когда пакеты были установлены/обновлены с помощью pip
Я знаю, как увидеть установленные пакеты Python с помощью pip, просто использовав команду pip freeze
. Но есть ли способ узнать дату и время установки или обновления пакета через pip?
5 ответ(ов)
Если вам не нужно различать обновленные и установленные пакеты, вы можете использовать время изменения файла пакета.
Вот пример кода для 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
.
К сожалению, упаковка 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. Он проходит по всем установленным пакетам, пытается определить путь к ним и получает время последнего изменения. Результат сортируется и выводится в удобном формате. Если возникают ошибки при получении пути, он использует запасные варианты для определения местоположения пакета.
**Решение 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
Я не знаю всех опций 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
и так далее.
Команда 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'
на реальный путь к нужному файлу пакета!
Как установить pip на macOS или OS X?
Как заставить pip переустановить текущую версию?
Что такое Python egg?
Как справиться с несколькими версиями Python и PIP?
'pip' не распознан как командa внутреннего или внешнего формата