如何指定python pip的安装顺序?
我正在使用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。
您可以使用:
cat requirements.txt | xargs pip install
这是一个愚蠢的骇客,但也许行之有效。 编写一个bash脚本,该脚本逐行读取您的需求文件并在其上运行pip命令。
#!/bin/bash
for line in $(cat requirements.txt)
do
pip install $line -E /path/to/virtualenv
done
要允许Requirements.txt中的所有类型的条目(例如,git存储库中的软件包),您需要使用以下命令集
cat requirements.txt | xargs -n 1 -L 1 pip install
必须分别使用-n 1和-L 1选项,才能将软件包一个接一个地安装,并将requirements.txt文件中的每一行都视为一个单独的项目。
遗憾的是,升级建议无法正常工作。 如果您在[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
手动调用需求文件(通过Shell脚本)中每个条目的pip所提供的解决方法似乎是当前的唯一解决方案。
Pymongo需要setuptools> = 0.6c9
你怎么知道的? 需要构建或安装? 您没有说要尝试安装的Pymongo版本,但是查看当前(3.2.2)版本的setup.py文件,既没有规范Pymongo要求运行setup.py(setup_requires),也没有要求安装什么(install_requires) 。 没有此类信息,点子不能确保setuptools的特定版本。 如果Pymongo需要特定版本的setuptools来运行其setup.py(而不是要求setuptools本身运行setup函数),那么另一个问题是直到最近还没有办法指定它。 现在有一个规范– PEP 518 –指定Python项目的最低构建系统要求,应该在pip中不久实现–实施PEP 518支持#3691。
关于安装顺序,此问题已在第6.1.0点中解决;
从pip install – pip文档的“安装顺序”部分:
从v6.1.0开始,pip会先安装依赖项,然后再安装依赖项。 按照“拓扑顺序”。 这是目前唯一的承诺点 与订单相关。
然后:
在v6.1.0之前,pip不对安装顺序作出任何承诺。
但是,如果没有正确指定Pymongo的要求,也将无济于事。
接下来是@lukasrms的解决方案-我必须这样做才能使pip一次安装我的需求:
cat requirements.txt | xargs -n 1 pip install
如果您的需求文件中有注释,则需要使用:
grep -v "^#" requirements.txt | xargs pip install
我最终在virtualenv内运行了pip而不是使用“ pip -E”,因为使用-E pip仍然可以看到服务器的站点软件包,这显然会弄乱一些安装。
对于没有virtualenvs的服务器,我也遇到了麻烦。 即使我使用单独的pip命令pymongo安装了setuptools,也将拒绝安装。
我通过与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中遇到了这些问题。
抱歉,我的第一个答案是错误的,因为我的setuptools> = 0.6c9。
似乎不可能,因为pymongo的setup.py需要setuptools> = 0.6c9,但是pip只下载了setuptools> = 0.6c9,尚未安装。
有人在我之前指出的问题中对此进行了讨论。
几周前,我自己创建了一个问题:在安装以前的软件包之前,不要对要求列表中的每个软件包运行egg_info。
对不起,嘈杂。
第一个答案:
将您的pip升级到0.8.3版本,此错误已修正了安装顺序。
现在,如果您升级,一切正常:-)