【问题标题】:See when packages were installed / updated using pip查看何时使用 pip 安装/更新软件包
【发布时间】:2014-09-04 08:33:39
【问题描述】:

我知道如何使用 pip 查看已安装的 Python 包,只需使用 pip freeze。但是有什么方法可以查看使用 pip 安装或更新包的日期和时间?

【问题讨论】:

    标签: python installation pip package


    【解决方案1】:

    解决方案 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、v3.7

    【讨论】:

    • 解决方案 1 非常适合 Python 3.8.10
    【解决方案2】:

    如果不需要区分更新和安装,您可以使用包文件的更改时间。

    对于带有 pip

    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 测试并安装了带有 pkg_resources 的 setuptools 40.8):

    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 list 而不是使用pip freeze,它能够提供更多信息,例如通过pip list -o 提供的过时软件包。

    【讨论】:

    • import pip 很有意思。
    • 查看package.location 的一大缺点是它只是包含模块目录的目录(例如/usr/local/lib/python2.7/dist-packages),所以即使如果您安装一个软件包,这将显示所有发行版都已更新。
    • pip 10 已将 get_installed_distributions 移至私有模块:pip._internal.get_installed_distributions()
    • @skjerns 刚刚做到了(略有延迟)。 ;)
    【解决方案3】:

    我最近也在找这个。但是虽然这里有很多好的答案,但真正的问题是由于 pip 默认不保存日志,我们不得不求助于使用文件 creationmodification 次,分别称为ctimemtime。 (见MAC-times。)不幸的是,使用这种方法有两个副作用:

    1. 不同的操作系统和 FS 以不同的方式处理 ctime/mtime(如果有的话)
    2. Python 安装使用许多不同的目录,其中一些在安装后保留,而另一些在运行时动态创建。很难知道要检查日期的确切文件。

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

    pip install pip-date


    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这似乎给出了最精确的结果。还 +1 用于排序和漂亮的格式。
      • 这绝对是查看软件包安装/上次更新时间的最有用的答案。谢谢!
      【解决方案5】:

      您可以使用--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 设施。

      【讨论】:

        【解决方案6】:

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

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

        应该给你文件的创建时间,即安装或更新包的日期。

        【讨论】:

          【解决方案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
          
          etc.
          

          顺便说一句:您可以使用--help查看某些功能的更多选项

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

          【讨论】:

            猜你喜欢
            • 2016-12-04
            • 2019-07-14
            • 2015-01-18
            • 1970-01-01
            • 2016-09-23
            • 2019-04-21
            • 2018-06-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多