如何指定python pip的安装顺序?

我正在使用fabric(0.9.4)+ pip(0.8.2),我需要为多个服务器安装一些python模块。 所有服务器都有老版本的setuptools(0.6c8),需要升级pymongo模块。 Pymongo需要setuptools> = 0.6c9。

我的问题是,点开始安装与pymongo而不是setuptools,导致点停止。 在需求文件中洗牌模块顺序似乎没有帮助。

requirements.txt:

setuptools>=0.6c9 pymongo==1.9 simplejson==2.1.3 

有没有一种方法来指定PIP的安装顺序,因为它似乎没有正确地做它本身?

这可以通过两个单独的需求文件来解决,但是如果我现在或将来不需要维护多个需求文件,那将会很好。

问题仍然存在与点0.8.3。

这是一个愚蠢的黑客,但可能只是工作。 编写一个bash脚本,它可以逐行读取需求文件,并在其上运行pip命令。

 #!/bin/bash for line in $(cat requirements.txt) do pip install $line -E /path/to/virtualenv done 

你可以使用:

 cat requirements.txt | xargs pip install 

要在requirements.txt中允许所有types的条目(例如来自git存储库的包),您需要使用以下一组命令

 cat requirements.txt | xargs -n 1 -L 1 pip install 

-n 1-L 1选项是逐个安装软件包所必需的,并将requirements.txt文件中的每一行作为一个单独的项目来处理。

可惜的是,升级build议不起作用。 如果你阅读https://github.com/pypa/pip/issues/24中的其他细节,你会明白为什么;

在尝试安装它之前,pip将首先构build所有的软件包。 因此,需求文件如下所示

 numpy==1.7.1 scipy==0.13.2 statsmodels==0.5.0 

statsmodels的构build将失败,并具有以下语句

 ImportError: statsmodels requires numpy 

为需求文件中的每个条目手动调用pip(通过shell脚本)提供的解决方法似乎是唯一的当前解决scheme。

在@ lukasrms的解决scheme之后 – 我必须这样做才能让pip一次一个地安装我的需求:

 cat requirements.txt | xargs -n 1 pip install 

如果您在需求文件中有评论,则需要使用:

 grep -v "^#" requirements.txt | xargs pip install 

Pymongo需要setuptools> = 0.6c9

你怎么知道的? 需要build立或安装? 你不说什么版本的Pymongo你试图安装,但看当前(3.2.2)版本的setup.py文件没有规定既不是什么Pymongo需要运行setup.pysetup_requires ),也不需要什么安装( install_requires )。 没有这样的信息点不能确保特定版本的setuptools。 如果Pymongo需要特定版本的setuptools来运行它的setup.py (而不是要求setuptools自己运行setup函数),那么另一个问题是,直到最近还没有办法指定它。 现在有规范 – PEP 518 – 指定Python项目的最低构build系统要求 ,应该很快用pip 实现 – 实现PEP 518支持#3691 。

至于安装顺序,这是固定在点6.1.0;

pip安装 – pip文档的安装命令 部分 :

从v6.1.0开始,pip在其依赖项之前安装依赖项,即按照“拓扑顺序”。 这是目前唯一与订单有关的承诺。

然后:

在v6.1.0之前,pip没有对安装顺序做出任何承诺。

但是,如果没有Pymongo的要求,也无济于事。

我结束了在virtualenv里面运行pip,而不是使用“pip -E”,因为-E pip仍然可以看到服务器的网站包,而这显然搞砸了一些安装。

没有virtualenvs的服务器也有问题。 即使我用单独的pip命令安装setuptools pymongo也会拒绝安装。

我解决了这个安装setuptools easy_install分开,因为这似乎是问题之间的点和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) 

我有这些问题与点0.8.3和0.8.2。

对不起,我的第一个答案是错误的,因为我有setuptools> = 0.6c9。

看来这是不可能的,因为pymongo的setup.py需要setuptools> = 0.6c9,但是pip只下载了setuptools> = 0.6c9,还没有安装。

有人在我指出的问题上讨论过这个问题。

几个星期前,我已经自己创build了一个问题: 在安装以前的软件包之前,不要在需求列表中运行egg_info软件包 。

对不起,嘈杂。


第一个答案:

升级您的点到0.8.3版本,它有一个错误修正安装顺序 。

现在,如果你升级一切工作:-)

检查这里的新闻: http : //www.pip-installer.org/en/0.8.3/news.html