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

时间:2011-03-22 16:14:38

标签: python pip virtualenv requirements.txt

我正在使用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。

9 个答案:

答案 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

现在如果升级一切正常: - )

点击此处查看新闻:http://www.pip-installer.org/en/0.8.3/news.html