以编程方式生成requirements.txt文件

问题描述 投票:0回答:4

我正在尝试以编程方式生成requirements.txt 文件。这样我就可以将其与第二个 .txt 文件进行比较。到目前为止,我已经尝试了以下方法,但它们仅将要求输出到控制台(没有生成 .txt 文件)。

到目前为止我已经尝试过了

    import pip

    pip.main(["freeze",">","requirements.txt"])

    from subprocess import call

    call(["pip","freeze", ">","requirements.txt"])

如果我尝试在终端中手动运行相同的命令,则生成文件不会出现问题。有什么建议吗?

python subprocess pip requirements.txt
4个回答
8
投票

要求pip直接提供发行版列表

脚本
myfreeze.py

import pip
with open("requirements.txt", "w") as f:
    for dist in pip.get_installed_distributions():
        req = dist.as_requirement()
        f.write(str(req) + "\n")

然后您将在

requirements.txt
文件中获得预期的内容。


4
投票
subprocess.Popen(['pip', 'freeze'], stdout=open('/tmp/pip.log', 'w'))

3
投票

pip 开发人员强烈反对为此使用 pip。它在最新版本的 pip 中也被破坏了。以下是链接的 Github 问题上建议的方法的摘要。与接受的答案非常相似,但使用

pkg_resources
模块代替。

import pkg_resources


def generate_pip_freeze() -> str:
    requirements = ""
    for dist in pkg_resources.working_set:
        req = dist.as_requirement()
        requirements += f"{req}\n"
    return requirements

或更简洁地说:

def generate_pip_freeze() -> str:
    return "\n".join(
        str(dist.as_requirement()) for dist in pkg_resources.working_set
    )

0
投票

现在

pkg_resources
已被弃用,您应该使用
importlib.metadata
(或
importlib_metadata
,它向后移植到早期的 Python 版本)

from importlib.metadata import packages_distributions, version
  
installed = {pkg for pkgs in packages_distributions().values() for pkg in pkgs}
req_str ="\n".join(f"{pkg}=='{version(pkg)}'" for pkg in installed)

with open("requirements.txt", "w") as f:
        f.write(req_str)
© www.soinside.com 2019 - 2024. All rights reserved.