我正在使用fabric(0.9.4)+ pip(0.8.2),我需要为多个服务器安装一些python模块。所有服务器都有旧版本的setuptools(0.6c8),需要升级为pymongo模块。 Pymongo需要setuptools> = 0.6c9。
我的问题是pip用pymongo而不是setuptools开始安装,导致pip停止。需求文件中的随机模块顺序似乎没有帮助。
requirements.txt:
setuptools>=0.6c9
pymongo==1.9
simplejson==2.1.3
有没有办法为pip指定安装顺序,因为它本身似乎没有正确执行?
这可以通过两个单独的需求文件来解决,但如果我现在或将来不需要维护多个需求文件,那将会很好。
问题持续存在于0.8.3。
答案 0 :(得分:24)
你可以使用:
cat requirements.txt | xargs pip install
答案 1 :(得分:11)
这是一个愚蠢的黑客,但可能只是工作。编写一个bash脚本,逐行读取需求文件并在其上运行pip命令。
#!/bin/bash
for line in $(cat requirements.txt)
do
pip install $line -E /path/to/virtualenv
done
答案 2 :(得分:11)
要在requirements.txt中允许所有类型的条目(例如来自git存储库的包),您需要使用以下命令集
cat requirements.txt | xargs -n 1 -L 1 pip install
-n 1 和 -L 1 选项是逐个安装软件包并将requirements.txt文件中的每一行视为单独项目所必需的。
答案 3 :(得分:7)
遗憾的是升级建议不起作用。如果您阅读https://github.com/pypa/pip/issues/24中的其他详细信息,您将看到原因
在尝试安装之前,pip将首先构建所有包。所以使用类似以下的需求文件numpy==1.7.1
scipy==0.13.2
statsmodels==0.5.0
statsmodels的构建将失败,并带有以下语句
ImportError: statsmodels requires numpy
为需求文件中的每个条目手动调用pip(通过shell脚本)给出的解决方法似乎是目前唯一的解决方案。
答案 4 :(得分:5)
Pymongo需要setuptools> = 0.6c9
你怎么知道的?需要构建还是要安装?你没有说你试图安装什么版本的Pymongo,但是查看当前(3.2.2)版本的setup.py
文件,没有规定Pymongo运行setup.py
所需的内容({{1安装(setup_requires
)也不需要它。没有这样的信息,pip无法确保特定版本的setuptools。如果Pymongo需要特定版本的setuptools来运行它的install_requires
(而不是要求setuptools运行setup.py
函数本身),那么另一个问题是直到最近还没有办法指定它。现在有规范 - PEP 518 - 指定Python项目的最低构建系统要求,这应该很快在pip中实现 - Implement PEP 518 support #3691。
关于安装顺序,这在pip 6.1.0中已经修复;
来自 pip install - pip文档的安装顺序 section:
从v6.1.0开始,pip在其依赖项之前安装依赖项,即 在“拓扑顺序”。这是目前唯一的承诺 与订单有关。
后来:
在v6.1.0之前,pip没有做出有关安装顺序的承诺。
然而,如果Pymongo没有正确规定要求,它也无济于事。
答案 5 :(得分:4)
接下来来自@ lukasrms的解决方案 - 我必须这样做才能获得pip来一次一个地安装我的要求:
cat requirements.txt | xargs -n 1 pip install
答案 6 :(得分:4)
如果您在需求文件中有评论,则需要使用:
grep -v "^#" requirements.txt | xargs pip install
答案 7 :(得分:1)
我最终在virtualenv中运行pip而不是使用“pip -E”,因为-E pip仍然可以看到服务器站点包,这显然搞砸了一些安装。
我在使用没有virtualenvs的服务器时遇到了麻烦。即使我使用单独的pip命令安装setuptools,pymongo也会拒绝安装。
我通过使用easy_install单独安装setuptools解决了这个问题,因为这似乎是pip和setuptools之间的问题。
来自fabfile.py的片段:
env.activate = "source %s/bin/activate" % virtualenv_path
_virtualenv("easy_install -U setuptools")
_virtualenv("pip install -r requirements.txt")
def _virtualenv(command)
if env.virtualenv:
sudo(env.activate + "&&" + command)
else:
sudo(command)
pip 0.8.3和0.8.2我遇到了这些问题。
答案 8 :(得分:0)
抱歉,我的第一个回答是错误的,因为我有setuptools> = 0.6c9。
似乎这是不可能的,因为pymongo的setup.py需要setuptools> = 0.6c9,但是pip只下载了setuptools> = 0.6c9,还没有安装。
有人在我之前指出的问题中讨论过它。
几周前我自己创建了一个关于它的问题:Do not run egg_info
to each package in requirements list before installing the previous packages。
抱歉吵闹。
第一个回答:
将您的点数升级到0.8.3版本,它有一个bugfix to installation order。
现在如果升级一切正常: - )