2011-03-22 85 views
38

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

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

requirements.txt:

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

是否有指定PIP安装顺序,因为它似乎并没有通过自己做正确的方式?

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

问题仍然存在,点数为0.8.3。

+0

据我所知,无法在pip的需求文件中设置订单。 – mouad 2011-03-22 16:17:52

+0

如果你看看pip.py的代码,有一个类调用RequirementSet来保存需求,这个类使用字典来保存需求,我认为这是你不能设置订单的方式,但是我很想知道如果我错了:) – mouad 2011-03-22 16:27:45

+0

这是固定在点6.1.0 - 请参阅我的答案的细节。 – 2016-03-18 14:26:17

回答

9

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

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

它是确定这种情况下,但要小心要求文件行想: --find链接http://mypypi.com/pypi – 2011-03-22 21:43:17

+5

该脚本可以酌情利用织物pythonized: '在开放线(“requirements.txt”,“r”): sudo(“pip -E%s install%s”%(virtualenv_path,line))' – 2011-03-23 14:05:56

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

+1

pip 0.8.3在这种情况下没有帮助 – 2011-03-23 12:00:19

1

我结束了运行中的virtualenv点子,而不是使用“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。

21

你可以使用:

cat requirements.txt | xargs pip install 
+0

错误:要求。 txt – tashuhka 2016-06-21 15:04:49

+0

修复@tashuhka,谢谢! – lukasrms 2016-06-21 18:24:20

+0

这是[无用的猫(UUoC)](http://porkmail.org/era/unix/award.html)。此外,您必须添加'-L 1'以确保只使用一条线.'xargs -L 1 pip install 2016-07-27 22:53:38

6

可悲的是升级的建议是行不通的。如果您阅读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脚本)似乎是目前唯一的解决方案。

+2

随着对pip添加拓扑排序([问题#2478:拓扑安装顺序] (https://github.com/pypa/pip/pull/2616))不再是这种情况--pip首先安装每个软件包的依赖关系,然后安装软件包本身。 – 2016-05-22 15:08:59

4

从@ lukasrms的解决方案继 - 我不得不这样做是为了让PIP安装我的要求之一,在-A-时间:

cat requirements.txt | xargs -n 1 pip install 
+0

如果你有'PIL == 1.1.7 --allow-external PIL --allow-unverified PIL'作为requirements.txt中的一个条目,这会起作用,但会导致问题 – 2015-03-04 11:54:16

9

要允许所有类型的项目(从git的例子包资料库)在requirements.txt您需要使用以下命令集

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

-n 1的-L 1选项逐个安装软件包,并把每行需要我n将requirements.txt文件作为单独的项目。

+0

这应该如何*允许来自git存储库的包*还是单独*所有类型的条目*(一个例子是“PIL == 1.1.7 - 允许外部PIL - 允许未验证的PIL”)? – 2016-03-24 21:41:46

4

如果你有你的要求发表评论的文件,你需要使用:

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

这是我用过的。适用于大多数情况。 – slallum 2016-03-27 08:08:50

4

Pymongo需要的setuptools> = 0.6c9

你怎么知道的?需要构建还是安装?你不会说你试图安装Pymongo的版本,但是在当前(3.2.2)版本中查看setup.py文件,没有Pymongo要求运行的规格setup.pysetup_requires)以及它需要安装的规格(install_requires) 。没有这样的信息点不能确保setuptools的特定版本。如果Pymongo要求特定版本的setuptools运行它的setup.py(而不是要求setuptools运行setup函数本身),那么另一个问题是,直到最近还没有办法指定它。现在有规范 - PEP 518 - 指定Python项目的最小生成系统需求,这应该很快在pip-Implement PEP 518 support #3691中实现。

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

PIP安装 - 安装顺序section PIP的文档:

随着V6.1.0中,PIP他们的家属之前安装的依赖关系,即在 “拓扑排序” 。这是目前 与订单相关的唯一承诺点。

及更高版本:

此前V6.1.0,PIP再没承诺有关安装顺序。

但是,如果没有Pymongo的要求进行适当的说明,它也无济于事。