How to specify install order for python pip?

I'm working with fabric(0.9.4)+pip(0.8.2) and I need to install some python modules for multiple servers. All servers have old version of setuptools (0.6c8) which needs to be upgraded for pymongo module. Pymongo requires setuptools>=0.6c9.

My problem is that pip starts installation with pymongo instead of setuptools which causes pip to stop. Shuffling module order in requirements file doesn't seem to help.

requirements.txt:

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

Is there a way to specify install order for pip as it doesn't seem to do it properly by itself?

This can be resolved with two separate requirements files but it would be nice if I didn't need to maintain multiple requirements files now or in the future.

Problem persists with pip 0.8.3.

34834 次浏览

This is a silly hack, but might just work. Write a bash script that reads from your requirements file line by line and runs the pip command on it.

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

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

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

有人在我之前指出的问题中讨论过这个问题。

几个星期前,我自己创建了一个关于它的问题: 在安装以前的包之前,不要对需求列表中的每个包运行 egg_info

抱歉这么吵。


First answer:

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

现在,如果您升级所有的程序: -)

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

我最终在 viralenv 中运行 pip,而不是使用“ pip-E”,因为 with-E pip 仍然可以看到服务器站点包,这显然搞砸了一些安装。

我在没有虚拟现实的服务器上也遇到了麻烦。即使我使用单独的 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)

I had these problems with pip 0.8.3 and 0.8.2.

你可以用:

cat requirements.txt | xargs pip install

遗憾的是,升级建议不起作用。如果你读了 https://github.com/pypa/pip/issues/24中的其他细节,你就会明白为什么

pip will build all packages first, before attempting to install them. So with a requirements file like the following

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

Statsmodel 的构建将因以下语句而失败

ImportError: statsmodels requires numpy

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

接下来是@lukasrms 的解决方案——我必须这样做才能让 pip 一次一个地安装我的需求:

cat requirements.txt | xargs -n 1 pip install

为了允许 Requments.txt 中的所有类型的条目(例如来自 git 存储库的包) ,您需要使用以下命令集

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

- n 1 L1选项对于逐个安装软件包是必需的,并且要将 requments.txt 文件中的每一行作为一个单独的项目来处理。

If you have comments in your requirements file you'll want to use:

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

Pymongo 需要 setuptools > = 0.6 c9

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

As to order of installation, this was fixed in pip 6.1.0;

摘自皮普文档的 Pip 安装-安装顺序 部分:

在 v6.1.0中,pip 在依赖项之前安装依赖项,即。 在“拓扑有序”。这是目前唯一的承诺点 与订单有关。

后来:

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

然而,如果 Pymongo 没有对需求进行适当的规范,那么它也无济于事。