等价于 `package.json' 和 `package-lock.json` for `pip`

Equivalent of `package.json' and `package-lock.json` for `pip`

JavaScript 的包管理器,如 npmyarn 使用 package.json 指定 'top-level' 依赖项,并创建 lock-file跟踪作为结果安装的所有包的特定版本(即顶级子级依赖项)。

此外,package.json允许我们区分顶级依赖的类型,例如productiondevelopment.

另一方面,对于Python,我们有pip。我想 lock 文件的 pip 等价物是 pip freeze > requirements.txt 的结果。

但是,如果您只维护这个 requirements.txt 文件,则很难区分顶级和子级依赖项(您需要 pipdeptree -r 来弄清楚) .如果您想删除或更改顶级依赖项,这可能是一个真正的痛苦,因为很容易留下孤立的包(据我所知,pip does not remove sub-dependencies 当您 pip uninstall一个包)。

现在,我想知道:是否有一些约定来处理这些requirements文件的不同类型并区分顶级和子级依赖关系pip?

例如,我可以想象有一个 requirements-prod.txt 只包含生产环境的顶级要求,作为 package.json 的(简化)等价物,和一个 requirements-prod.lock,其中包含 pip freeze 的输出,并充当我的 lock 文件。此外,我可以有一个 requirements-dev.txt 用于开发依赖项,等等。

我想知道这是不是要走的路,或者是否有更好的方法。

p.s。 condaenvironment.yml.

也可以问同样的问题

今天至少有三个不错的选择:

  1. Poetry uses pyproject.toml and poetry.lock files,与 package.json 和锁定文件在 JavaScript 世界中的工作方式非常相似。

    现在这是我的首选解决方案。

  2. Pipenv uses Pipfile and Pipfile.lock,也很像你描述的 JavaScript 文件。

Poetry 和 Pipenv 都不仅仅是依赖管理。开箱即用,他们还为您的项目创建和维护虚拟环境。

  1. pip-tools 提供 pip-compilepip-sync 命令。在这里,requirements.in 列出了您的直接依赖项,通常具有松散的版本限制,并且 pip-compile 从您的 .in 文件中生成锁定的 requirements.txt 文件。

    这曾经是我的首选解决方案。它是向后兼容的(生成的 requirements.txt 可以由 pip 处理)并且 pip-sync 工具确保 virtualenv 与锁定版本完全匹配,删除不在你的“锁”中的东西" 文件。