Python:以编程方式运行“pip list”

2024-04-16 17:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何以编程方式获取pip list提供的信息而不调用pip子程序?在


Tags: pip代码信息报告编程方式差异list
3条回答

为了完整起见,下面是vittore的pip.main()的想法,它通过stdout的捕获得到了充实。当然,使用get_installed_distributions()是首选的解决方案。在

import contextlib
@contextlib.contextmanager
def capture():
    import sys
    from cStringIO import StringIO
    oldout,olderr = sys.stdout, sys.stderr
    try:
        out=[StringIO(), StringIO()]
        sys.stdout,sys.stderr = out
        yield out
    finally:
        sys.stdout,sys.stderr = oldout, olderr
        out[0] = out[0].getvalue()
        out[1] = out[1].getvalue()

with capture() as out:
    import pip
    pip.main(['list'])

print out
    ['awscli (1.7.45)\nboto (2.38.0) ...

截至2019年2月1日,最热门的答案已经过时,不再适用于更新版本的pip。在

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

选项:

A_内部.main

from pip import _internal
_internal.main(['list'])

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

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

A.包装资源

^{pr2}$

B.iter_模块

执行需要很长时间(在带i5cpu、SSD和8gigs ram的计算机上大约300ms)。 好处是它将有一个更广泛的模块列表,并输出可导入的名称。在

例如:python-dateutil作为dateutil导入,但是iter_模块将为您提供可导入的名称:dateutil

from pkgutil import iter_modules
print([p.name for p in iter_modules()])

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

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

又名我懒得做这件事,祝你好运!:天

更新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),
 ...

原始答案

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

^{pr2}$

好吧,有更好的方法:

pip.utils.get_installed_distributions()

返回已安装程序包的列表。在

packages = pip.utils.get_installed_distributions()

p = packages[0]

p.project_name 
p.version
p.egg_name
p.location

您可以从源代码here中看到pip list在做什么

另外,get_installed_distributions接受整串参数以仅返回本地包(来自当前virtualenv)等。请参阅帮助here。在

还有来自_vendor模块的底层命令:

[p for p in pip._vendor.pkg_resources.working_set]

但是get_installed_distributions提供了更简单的api。在

相关问题 更多 >