我在git问题跟踪器上发布了此问题:https://github.com/pypa/pip/issues/2969
我们可以在python中调用pip freeze / list,即不是shell上下文吗?
我希望能够导入pip并执行items = pip.freeze()之类的操作。调用pip.main([' freeze'])写入stdout,不返回str值。
答案 0 :(得分:17)
新版本中有一个pip.operation.freeze(> 1.x):
try:
from pip._internal.operations import freeze
except ImportError: # pip < 10.0
from pip.operations import freeze
x = freeze.freeze()
for p in x:
print p
输出符合预期:
AMQP == 1.4.6
anyjson == 0.3.3
台球== 3.3.0.20
defusedxml == 0.4.1
Django的== 1.8.1
Django的picklefield == 0.3.1
docutils的== 0.12
......等等。
答案 1 :(得分:3)
实际上,pip >= 10.0.0
包operations.freeze
已移至pip._internal.operations.freeze
。
因此导入freeze
的安全方法是:
try:
from pip._internal.operations import freeze
except ImportError:
from pip.operations import freeze
答案 2 :(得分:1)
pip不支持此处的其他答案:https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
根据pip开发人员:
如果您直接导入pip的内部结构并使用它们,则不是受支持的用例。
尝试
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
答案 3 :(得分:0)
不建议您使用pip._internal.operatons
之类的“私有”功能。您可以改为执行以下操作:
import pkg_resources
env = dict(tuple(str(ws).split()) for ws in pkg_resources.working_set)