查看何时使用 pip 安装/更新软件包
Posted
技术标签:
【中文标题】查看何时使用 pip 安装/更新软件包【英文标题】:See when packages were installed / updated using pip 【发布时间】:2014-09-04 08:33:39 【问题描述】:我知道如何使用 pip 查看已安装的 Python 包,只需使用 pip freeze
。但是有什么方法可以查看使用 pip 安装或更新包的日期和时间?
【问题讨论】:
【参考方案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 默认不保存日志,我们不得不求助于使用文件 creation 和 modification 次,分别称为ctime
和mtime
。 (见MAC-times。)不幸的是,使用这种方法有两个副作用:
-
不同的操作系统和 FS 以不同的方式处理 ctime/mtime(如果有的话)
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.
【讨论】:
以上是关于查看何时使用 pip 安装/更新软件包的主要内容,如果未能解决你的问题,请参考以下文章