我正在编写一些代码来报告和协调两个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.
截至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
归档时间: |
|
查看次数: |
3895 次 |
最近记录: |