2011-03-22 26 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的要求進行適當的說明,它也無濟於事。