如何在Python中检索pip要求(冻结)?

时间:2015-07-08 21:23:03

标签: python pip freeze

我在git问题跟踪器上发布了此问题:https://github.com/pypa/pip/issues/2969

我们可以在python中调用pip freeze / list,即不是shell上下文吗?

我希望能够导入pip并执行items = pip.freeze()之类的操作。调用pip.main([' freeze'])写入stdout,不返回str值。

4 个答案:

答案 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.0operations.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)