2009-12-29 33 views
24

上一次我不得不擔心安裝Python包是兩年前與Enthought,NumPy和一起工作。這種經歷給我留下了一些與古怪行爲有關的噩夢,安裝&更新非標準位置的Python包(例如$HOME/usr/local2.6/)。Python狀態封裝:構建,分發,Distutils,EasyInstall等

無論如何,我的工作讓我回到安裝各種Python軟件包。 CheeseShop Tutorial除了Buildout之外還提到了DistUtils和EasyInstall!我很難找到一個比較這些(和其他)PyPi安裝工具的地方,所以我希望能夠進入StackOverflow社區:&每個安裝工具的缺點是什麼?

+1

部署層似乎比當今典型的包更復雜。雞蛋,容易這個和虛擬的......很抱歉,但我更喜歡將.py文件複製到sys.path中。至少這樣我可以看到發生了什麼,並且不會出現莫名的部署和導入錯誤。 – bobince 2009-12-29 23:36:36

+0

沒有人提到過'distutils2'與'distutils'和'bento' ... – Brendan 2011-03-20 13:05:05

+1

我寫的這個答案會回覆部分問題:http://stackoverflow.com/a/6522905/821378 – 2012-02-11 03:42:03

回答

10

首先,不管你決定的安裝工具,開始使用virtualenv --no-site-packages!這樣,python軟件包就不會在全球範圍內安裝,您可以輕鬆地回到舊的以及新的項目中。

現在,您的比較有點蘋果梨,因爲您列出的工具不是相互排斥的。不過,我可以完全推薦Buildout。它將安裝python軟件包以及其他東西,並允許您自動安裝和部署(複雜)項目。

此外,我建議查看Fabric作爲自動管理任務的一種手段。

0

我不能輕易幫你找到實力,但我可以讓它更難一點,因爲它也取決於你想使用的平臺。

例如,如果您需要在基於Gentoo(GNU/Liunx)的計算機上安裝python軟件包,可以使用g-pypi爲所有使用distutils的軟件包(而不是setup.py)創建ebuild。這樣他們就可以完全集成到系統中,並可以像所有其他工具一樣添加,更新和刪除。但它自然只適用於基於Gentoo的系統。

此外,您可以使用yolk瞭解您的系統上安裝的所有軟件包(不僅限於Gentoo)。當我編寫代碼時,我只是使用distutils(因爲它允許非常容易地構建portage ebuild),有時還有基本的setuptools功能,或者組織我的程序,以便人們可以從程序文件夾下載並運行它們(理想情況下只需解壓源存檔/克隆存儲庫的地方)。這不是一個完美的解決方案,但是在覈心python團隊決定他們想要移動哪種方式之前,我不想修復可能消失的路徑。

9

在對所有項目使用buildout之前,我已經對這個主題(幾個星期的價值)進行了一些研究,並做了一些研究。

DistUtils和EasyInstall除了構建!

創建一個地方來比較所有這些工具的困難在於它們都是同一個工具鏈的一部分,並且一起用來創建可預測,可靠和靈活的工具集。

例如,easy_install用於將pypi(cheeseshop)中的distutils軟件包安裝到您的系統Python站點包目錄中。這極大地簡化了軟件包到系統/全局sys.path的安裝。

easy_install對於所有項目都一致的軟件包非常方便。但是,我發現我更喜歡使用系統的easy_install來安裝項目不依賴的軟件包。例如,github-cli我用於每個項目,因爲它允許我從命令行與項目的Github問題進行交互。我將這與項目一起使用,但這是爲了方便,項目本身並不依賴於此包。我使用構建。 Buildout允許你明確指出你的項目依賴於什麼版本的軟件包。我更喜歡通過pip-requirements.txt構建,因爲buildout是聲明性的。使用pip,您可以安裝軟件包,並在開發結束時生成requirements.txt文件。另一方面,通過構建,可以在將包egg添加到項目之前修改buildout.cfg。這迫使我意識到我要添加到項目中的包。

現在,有一個問題virtualenv。 virtualenv最廣爲人知的特性之一顯然是- 無站點包選項。我沒有發現這個選項特別有用,因爲我使用buildout。構建管理sys.path,只包含我要求包含的包。它還包括系統Python站點包中的所有內容,但由於我沒有任何項目中使用的東西,因此我從來沒有發生衝突。

此外,我發現--no-site-packages只會阻礙我的開發過程,因爲我使用我的系統的包裝系統安裝了一些軟件包。通常,任何有C庫的東西都需要編譯,我通過系統的打包系統進行安裝。

在項目的fabfile.py我包含測試函數來測試我通過系統的包管理器安裝的系統包的存在。

總之,這裏是我如何使用這些工具:

系統的軟件包管理器(apt-get的,山藥,港口,芬克...) 我用其中的一個安裝Python版本的我需要在這個系統上。我還使用它來安裝包含c庫的包,如lxml

easy_install 我用來從所有項目上使用pypi安裝軟件包,但項目不依賴於這些軟件包。

擴建 我用來管理項目的依賴關係。

根據我的經驗,這個工作流程非常靈活,便於攜帶並且易於使用。