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

Rex*_*din 9 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值.

Rex*_*din 21

在较新的版本(> 1.x)中有一个pip.operation.freeze:

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
Run Code Online (Sandbox Code Playgroud)

输出符合预期:

amqp == 1.4.6
anyjson == 0.3.3
billiard == 3.3.0.20
defusedxml == 0.4.1
Django == 1.8.1
django-picklefield == 0.3.1
docutils == 0.12
... etc

  • 对于那些想要将所有包放在变量中(而不是直接打印)的人,这会很好用: `x = "\n".join(list(freeze.freeze()))` (3认同)

Zak*_*Zak 14

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'])
Run Code Online (Sandbox Code Playgroud)


sed*_*deh 10

不建议依赖“私有”函数,例如pip._internal.operatons. 您可以执行以下操作:

import pkg_resources
env = dict(tuple(str(ws).split()) for ws in pkg_resources.working_set)
Run Code Online (Sandbox Code Playgroud)