`pip freeze > requirements.txt`
自动按字母顺序依次写我的依赖关系,如下所示: -
matplotlib==1.2.0
numpy==1.6.2
pandas==0.9.1
这个问题是pip install -r requirements.txt
(当我部署我的代码及其在requirements.txt
中列出的依赖项时)将最终失败,因为matplotlib需要先安装numpy。
当我在requirements.txt
文件中时,如何确保matplotlib在pip freeze
文件中的numpy之后被列出?
对于你的情况并不重要,因为pip
构建了每个要求(为每个要求调用python setup.py egg_info
),然后安装它们。对于您的具体情况,这没关系,因为当前需要在构建numpy
时安装matplotlib
。
这是matplotlib
的一个问题,他们提出了修复它的建议:https://github.com/matplotlib/matplotlib/wiki/MEP11
请参阅pip问题跟踪器:https://github.com/pypa/pip/issues/25上此问题的评论
这个问题与Matplotlib requirements with pip install in virtualenv重复。
你可以尝试命令
pip install --no-deps -r requirements.txt
这将安装包没有依赖关系,可能你会摆脱上面写的问题。
请注意,h5py(HDF5 Python包装器)具有相同的问题。
我的解决方法是将pip freeze
的输出分成两部分:进入一个只包含numpy版本${NUMPY_REQS}
的短需求文件,以及一个包含所有其他包的长${REQS}
。注意第二个-v
的grep
开关,即“反向匹配”。
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上实现相同的功能。
可以像这样使用包含所需顺序的包的文件:
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