2024-05-16 20:41:38 发布
网友
我正在编写一些代码来报告和协调两个pip管理的python安装之间的差异。在
如何以编程方式获取pip list提供的信息而不调用pip子程序?在
pip list
为了完整起见,下面是vittore的pip.main()的想法,它通过stdout的捕获得到了充实。当然,使用get_installed_distributions()是首选的解决方案。在
pip.main()
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.包装资源
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:
list
好吧,有更好的方法:
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。在
get_installed_distributions
还有来自_vendor模块的底层命令:
_vendor
[p for p in pip._vendor.pkg_resources.working_set]
但是get_installed_distributions提供了更简单的api。在
为了完整起见,下面是vittore的
pip.main()
的想法,它通过stdout的捕获得到了充实。当然,使用get_installed_distributions()
是首选的解决方案。在截至2019年2月1日,最热门的答案已经过时,不再适用于更新版本的pip。在
但不用担心,仍然可以通过编程方式获取包列表:
选项:
A_内部.main
这将用Package打印出三列。版本和位置
注意,不建议使用pip的内部api。在
A.包装资源
^{pr2}$B.iter_模块
执行需要很长时间(在带i5cpu、SSD和8gigs ram的计算机上大约300ms)。 好处是它将有一个更广泛的模块列表,并输出可导入的名称。在
例如:python-dateutil作为dateutil导入,但是iter_模块将为您提供可导入的名称:dateutil
C.通过子进程在命令行中调用pip
解决这个问题的方法很简单,我将把它作为练习留给读者
又名我懒得做这件事,祝你好运!:天
更新Python 3.6和Pip 19.0.1
原始答案
Pip只是python模块,所以只需导入它并调用
^{pr2}$list
:好吧,有更好的方法:
返回已安装程序包的列表。在
您可以从源代码here中看到
pip list
在做什么另外,
get_installed_distributions
接受整串参数以仅返回本地包(来自当前virtualenv)等。请参阅帮助here。在还有来自
_vendor
模块的底层命令:但是
get_installed_distributions
提供了更简单的api。在相关问题 更多 >
编程相关推荐