当我们使用pip安装python包时,有时它会安装一些其他包。例如安装 torch 需要安装 numpy。想象一下,在requirements.txt 文件中有一些软件包及其版本,但顺序不正确。我们怎样才能实现正确的顺序呢? (例如,如果 numpy 版本指定为 1.1,但列表中的先前包会自动安装最新版本的 numpy!)
我安装了librosa==0.9.2,它在安装过程中安装了scipy 1.10。但之后列表中有 scipy=1.8 。不会产生冲突吗?
如果您使用现代工具(Python、pip 等)和用现代技术打包的库(
[build-system]
中的pyproject.toml
部分),安装顺序根本不重要。
在您演示的情况下,可能是 pip 必须构建 librosa (因为找不到兼容的 wheel)。 pip 确实在短暂的一次性隔离虚拟环境中构建,因此可能 pip 使用 scipy 1.10 来构建 librosa。但是在您的实际虚拟环境中安装的是不同版本的scipy(1.8),这本身不是问题。在某些情况下,库仅在运行时与其构建的库兼容。
我确信我的答案可以改进,但我喜欢管理依赖关系,以避免您所描述的子依赖关系混淆:
创建
requirements.in
,放置所需的包和版本,但不包含它们的依赖项。
# requirements.in
numpy
pandas==2.2.2
使用pip-tools生成requirements.txt:
pip[3] install pip-tools
pip-compile requirements.in
现在您将拥有一个漂亮且干净的requirements.txt,您可以在其中看到子依赖项版本,以及来自
requirements.in
的哪些软件包需要它们。
numpy==1.26.4
# via
# -r requirements.in
# pandas
pandas==2.2.2
# via -r requirements.in
python-dateutil==2.9.0.post0
# via pandas
pytz==2024.1
# via pandas
six==1.16.0
# via python-dateutil
tzdata==2024.1
# via pandas
通常,当前的软件包安装程序(如 pip、mamba 等)可以很好地处理软件包版本/冲突,但是,如果您有充分的理由需要指定顺序或选择,您可以创建多个需求文件并使用 docker 或其他环境管理工具按照您想要的顺序安装其中的一个选择。比如:
RUN pip install -r requirements_01.txt
RUN pip install -r requirements_02.txt
RUN pip install -r requirements_dev.txt
...