程序化生成requirements.txt文件

6 投票
4 回答
4102 浏览
提问于 2025-04-18 10:28

我想要通过编程的方式生成一个requirements.txt文件。这样我就可以把它和另一个.txt文件进行对比。目前为止,我尝试了以下方法,但它们只是在控制台输出了需求,并没有生成.txt文件。

到目前为止,我尝试了

    import pip

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

还有

    from subprocess import call

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

不过如果我在终端手动运行相同的命令,文件就能顺利生成。有什么建议吗?

4 个回答

1

现在因为 pkg_resources 已经不再推荐使用了,你应该用 importlib.metadata 来替代它(如果你用的是早期版本的Python,可以用 importlib_metadata,这是它的一个兼容版本)

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)
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
    )
4
subprocess.Popen(['pip', 'freeze'], stdout=open('/tmp/pip.log', 'w'))

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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 文件中得到想要的内容。

撰写回答