pip freeze和依赖关系的顺序

8
`pip freeze > requirements.txt` 

自动将我的依赖项以表面上的字母顺序写入,如下所示:-
matplotlib==1.2.0
numpy==1.6.2
pandas==0.9.1

问题在于,当我将代码及其依赖项列在requirements.txt中时,使用pip install -r requirements.txt安装时会因为matplotlib需要先安装numpy而失败。

我该如何确保在pip freeze时,在requirements.txt文件中,numpy的顺序在matplotlib之前?

4个回答

2
可以使用按照所需顺序排列的软件包文件,如下所示:
pip freeze -r sorted-package-list.txt > requirements.txt

其中sorted-package-list.txt包含

numpy
matplotlib

注意:未包含在sorted-package-list.txt文件中的软件包将附加到要求文件末尾。
示例结果:
numpy==1.14.1
matplotlib==2.2.3
## The following requirements were added by pip freeze:
pandas==0.23.4

请查看 pip freeze --help 以获取更多选项。 - fabianegli

2

对于您的情况并不重要,因为pip会构建每个要求(对于每个要求都调用python setup.py egg_info),然后安装它们。对于您特定的情况,这并不重要,因为在构建matplotlib时,目前需要安装numpy

这是matplotlib的一个问题,他们创建了一个提案来解决这个问题:https://github.com/matplotlib/matplotlib/wiki/MEP11

请查看此问题在pip问题跟踪器中的评论:https://github.com/pypa/pip/issues/25

这个问题是在虚拟环境中使用pip安装Matplotlib的要求的复制。


1

您可以尝试以下命令:

pip install --no-deps -r requirements.txt

这将安装没有依赖关系的软件包,可能会解决上述问题。


1
你指的是--no-deps。但是这可能会与其他具有依赖关系并需要安装这些依赖关系的软件包造成问题。 - Calvin Cheng

0
请注意,h5py(HDF5 Python包装器)也有同样的问题。
我的解决方法是将pip freeze的输出分成两部分:一个短的要求文件,只包含numpy的版本${NUMPY_REQS},和一个长的${REQS},包含所有其他软件包。请注意第二个grep-v开关,即“反向匹配”。
pip freeze | tee >( grep  '^numpy' > ${NUMPY_REQS} ) | grep -v '^numpy' > ${REQS}

然后调用pip install两次(例如在安装虚拟环境时):

# this installs numpy
pip install -r ${NUMPY_REQS}

# this installs everything else, h5py and/or matplotlib are happy
pip install -r ${REQS}

请注意,此tee / grep魔法组合仅适用于类Unix系统。不知道如何在Windows上实现相同的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接