如何在 Python 3 中列出使用 pip 安装的第 3 方项目(库等)

How to list the 3rd party projects (libraries, etc.) installed using pip in Python 3

是否有任何 Python 脚本或 Python 代码可以给我 Python 项目 的列表(分发包:库,等)安装(例如 pip)以便我可以循环迭代它们?

它应该在 python3.x 中工作。

pip list 命令将为您提供所有软件包及其安装版本的列表:

Package                       Version
----------------------------- ------------
ailment                       9.0.4663
alabaster                     0.7.12
angr                          9.0.4663
appdirs                       1.4.4
apsw                          3.33.0.post1
... more lines that I cut off

如果您想在 python 中循环执行此操作,则可以使用 subprocess.check_output 捕获输出然后进行一些字符串处理:

import subprocess

packages = subprocess.check_output(["python3", "-m", "pip", "list"]).decode("utf8")

package_lines = map(str.split, packages.splitlines()[2:])

for package_name, version in package_lines:
    print(f"Package {package_name} has version {version}")

您可以使用

pip freeze 

在您的终端上列出所有已安装的 python 模块。

如果您希望这些模块作为您的 python 程序中的列表,您可以使用 pkg_resources 模块

# Credit: https://www.activestate.com/resources/quick-reads/how-to-list-installed-python-packages/
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
                                  for i in installed_packages])
print(installed_packages_list)

您可以使用 python 中的 pip 库轻松做到这一点:

try:
    from pip._internal.operations import freeze
except ImportError:  # in case pip version < 10.0
    from pip.operations import freeze
modules = list(freeze.freeze())

现在 modules 变量是一个包含所有安装的 pip 的列表 modules/packages。

这就是我 运行 时为我存储在模块中的内容:

['altgraph==0.17', 'appdirs==1.4.4', 'argon2-cffi==20.1.0', 'async-generator==1.10', 'attrs==20.2.0', 'auto-py-to-exe==2.7.8', 'autopep8==1.5.4', 'backcall==0.2.0', 'beautifulsoup4==4.9.1', 'bleach==3.2.1', 'bottle==0.12.18', 'bottle-websocket==0.2.9', 'cachetools==4.1.1', 'certifi==2020.6.20', 'cffi==1.14.3', 'chardet==3.0.4', 'click==7.1.2', 'colorama==0.4.3', 'cryptography==3.2.1', 'cycler==0.10.0', 'decorator==4.4.2', 'defusedxml==0.6.0', 'distlib==0.3.1', 'docopt==0.6.2', 'Eel==0.12.4', 'entrypoints==0.3', 'et-xmlfile==1.0.1', and so on.....]

我把它剪短了,因为对我来说有很多。

Python 的标准库中有一种非常简单直接的方法可以直接执行此操作。使用 importlib.metadata.

例如:

#!/usr/bin/env python3

import importlib.metadata

for distribution in importlib.metadata.distributions():
    print(distribution.metadata['Name'], distribution.metadata['Version'])

这适用于 Python 3.8+。对于早于 3.8 的版本,我建议使用 importlib-metadata 以获得完全相同的功能。