查看使用pip安装/更新软件包的时间

时间:2014-07-14 12:13:23

标签: python pip

我知道如何使用pip查看已安装的Python包,只需使用pip freeze即可。但有没有办法查看使用pip安装或更新软件包的日期和时间?

7 个答案:

答案 0 :(得分:21)

如果更新和安装之间没有必要,您可以使用包文件的更改时间。

类似于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))))

在这两种情况下,输出看起来都像numpy 1.12.1: Tue Feb 12 21:36:37 2019

顺便说一下:您可以使用pip freeze而不是pip list,而pip list -o可以通过{{1}}提供更多信息,例如过时的套餐。

答案 1 :(得分:11)

不幸的是,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))

答案 2 :(得分:3)

您可以使用--log选项:

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

E.g:

$ 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设施。

答案 3 :(得分:3)

解决方案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&amp; 2兼容性:

  • pip v10.x的更新解决方案
  • python v2,v2.7,v3,v3.5

答案 4 :(得分:2)

我不知道所有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.

答案 5 :(得分:2)

我最近也在寻找这个。但是,尽管这里有很多好的答案,但真正的问题在于,由于pip默认情况下不保留日志,因此我们不得不求助于文件 creation modification 的时间,分别称为ctimemtime。 (请参阅MAC-times。)不幸的是,使用此方法有两个副作用:

  1. 不同的OS和FS处理ctime / mtime的方式不同(即使可用)
  2. Python安装正在使用许多不同的目录,有些在安装后保留,而其他则在运行时动态创建。使得很难知道要检查日期的文件。

但是,有一个名为pip-date的工具试图结合几种不同的方法。

pip install pip-date


enter image description here

答案 6 :(得分:0)

pip freeze为您提供所有已安装的软件包。假设你知道文件夹:

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

应该为您提供文件的创建时间,即软件包安装或更新的日期。