我有同样的问题,并提出了一个更通用和简单的解决方案。我使用众所周知的
requirements.txt
来列出所有明确的依赖项,而使用
requirements.lock
则列出所有包括子依赖项在内的软件包列表。
个人喜欢通过发行版内置的软件包管理器来管理
python
、
pip
和
setuptools
,并在
虚拟环境 中安装 pip 依赖项。
通常情况下,您会开始安装所有直接需要的依赖项。这将同时拉取所有子依赖项。如果您没有使用虚拟环境,请务必添加
--user
标志。
pip3 install -r requirements.txt
pip3 install <package>
如果您想升级软件包,您也有
多个选项。由于我正在使用虚拟环境,所以我会始终更新所有软件包。但是您可以选择仅更新直接要求的软件包。如果它们需要更新其依赖项,则这些依赖项也将被拉入,其他所有内容将保持不变。
pip3 install -r <(pip3 list --outdated --format freeze --exclude pip setuptools | cut -d '=' -f1) --upgrade
pip3 install -r <(cut -d '=' -f1 requirements.txt) --upgrade
现在我们来到棘手的部分:保存我们的需求文件。确保先前的需求文件已经检入了git,这样如果出现任何问题,你就有一个备份。
请记住,我们希望区分明确安装的软件包(
requirements.txt
)和包含其依赖项的软件包(
requirements.lock
)。
如果您还没有设置
requirements.txt
,我建议运行以下命令。请注意,如果子依赖项已经被另一个软件包满足,
它将不包括子依赖项。这意味着如果
requests
已经被其他软件包满足,它将不会出现在列表中。如果您的脚本明确依赖于这样的软件包,您可能仍然需要手动添加它。
pip3 list --not-required --format freeze --exclude pip --exclude setuptools > requirements.txt
如果您已经有一个 requirements.txt
文件,您可以使用 这个 sed 技巧 来更新它。这将保留所有子依赖项之外的内容,我们将在下一步中仅包含在 requirements.lock
中。
pip3 freeze -r requirements.txt | sed -n '/## The following requirements were added by pip freeze:/q;p' | sponge requirements.txt
最后,我们可以将所有依赖项输出到一个requirements.lock
文件中,这将是我们所有软件包和版本的完整列表。如果我们在复现问题时遇到问题,我们可以随时回到这个锁定文件,并使用以前工作的依赖项运行我们的代码。
pip3 freeze -r requirements.txt > requirements.lock