Python:以编程方式运行"pip list"

Mar*_*son 15 python pip

我正在编写一些代码来报告和协调两个pip管理的python安装之间的差异.

如何在pip list不进行子程序调用pip的情况下以编程方式获取所提供的信息?

vit*_*ore 10

Python 3.6和Pip 19.0.1的更新

> from pip._internal.utils.misc import get_installed_distributions
> p = get_installed_distributions()
> pprint.pprint(p)

[wheel 0.32.3 (/usr/local/lib/python3.7/site-packages),
 wcwidth 0.1.7 (/usr/local/lib/python3.7/site-packages),
 virtualenv 16.0.0 (/usr/local/lib/python3.7/site-packages),
 virtualenv-clone 0.3.0 (/usr/local/lib/python3.7/site-packages),
 urllib3 1.24.1 (/usr/local/lib/python3.7/site-packages),
 typing 3.6.6 (/usr/local/lib/python3.7/site-packages),
 terminaltables 3.1.0 (/usr/local/lib/python3.7/site-packages),
 ...

Run Code Online (Sandbox Code Playgroud)

原始答案

Pip只是python模块,所以只需导入它并调用list:

import pip

pip.main(['list'])

# you can get details on package using show:

pip.main(['show', 'wheel'])
Run Code Online (Sandbox Code Playgroud)

好的,有更好的方法:

pip.utils.get_installed_distributions()
Run Code Online (Sandbox Code Playgroud)

返回已安装的软件包列表.

packages = pip.utils.get_installed_distributions()

p = packages[0]

p.project_name 
p.version
p.egg_name
p.location
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看pip list源代码的功能

同时get_installed_distributions接受一大堆参数只返回本地包(来自当前的virtualenv)等.请在此处查看帮助.

_vendor模块中还有基础低级命令:

[p for p in pip._vendor.pkg_resources.working_set]
Run Code Online (Sandbox Code Playgroud)

但是get_installed_distributions提供更简单的api.


Alm*_*non 9

截至2019年2月1日的最佳答案已过时,不再适用于较新版本的pip。

但不用担心-仍然可以通过编程方式获取软件包列表:

选项:

A._internal.main

from pip import _internal
_internal.main(['list'])
Run Code Online (Sandbox Code Playgroud)

这将在Package中打印出三列。版本和位置

请注意,不建议使用pip的内部api。

A.pkg_resources

import pkg_resources
print([p.project_name for p in pkg_resources.working_set])
# note that this is same as calling pip._vendor.pkg_resources.working_set
Run Code Online (Sandbox Code Playgroud)

B.iter_modules

执行时间很长(带有I5 CPU,SSD和8 gigs ram的计算机上约300ms)。好处是,它有一个模块的更广泛的列表,它会输出导入的名称。

例如:python-dateutil被导入为dateutil,但是iter_modules将为您提供可导入的名称:dateutil

from pkgutil import iter_modules
print([p.name for p in iter_modules()])
Run Code Online (Sandbox Code Playgroud)

C.通过子进程在命令行中调用pip

解决这个问题的方法很简单,我将其作为练习留给读者

也就是我太懒了,祝你好运!:D