如何指定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.py
( setup_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