2011-07-15 80 views
4

我在服務器端開發了相當龐大的python應用程序,包括所有數據庫連接,文件提取,解析和命令行調用。在一個包中輕鬆部署Python和應用程序,對於Linux

由於我在標準python lib之外使用了許多第三方模塊,因此它變成了部署的噩夢。我失去了他們的蹤跡。尤其是不同版本的Linux操作系統使用不同版本的操作系統,因此使用操作系統的軟件包管理器安裝它們已經不再好。

我想將它們部署到所有包中,包括當前使用的Python版本(大部分操作系統仍然使用Python 2.5,6,我使用2.7和2.7特定功能)。

此外,我必須教客戶如何部署,以便他們可以在其他服務器上測試。但他們不是Linux專家。我必須通過一個腳本或通過複製和粘貼來簡化操作。

Windows有PortablePython但Linux沒有。而我從來沒有使用Python包裝,因爲我通常在服務器上工作,我只主持。

請賜教python的可用打包和部署選項,其中包括所有已安裝的python模塊和python本身。

+0

http://docs.python.org/distutils/builtdist.html – Eddie

+0

請看[pyinstaller](http://www.pyinstaller.org/)。 –

+0

我所看到的。 pyinstaller會在線安裝必要的軟件包嗎?我想捆綁包的確切版本。 pyinstaller會有幫助嗎?我的包大部分不在它支持的模塊列表中,所以嗯..我認爲它不會工作? –

回答

5

大多數Python包可以通過在部署一個lib或類似的目錄,並在Python或PYTHONPATH其添加到sys.path外,然後複製軟件包目錄(通常的目錄你解壓縮)成部署目錄。這使您可以將包含已部署代碼的包保存在Mercurial存儲庫中。

部署Python本身將是更多的麻煩,但如果你可以控制它的安裝(如/usr/local/opt),那麼它只是一個./configure --prefix=...makesudo make install問題。然後,只要腳本被標記爲可執行文件,您就可以通過像#!/usr/local/bin/python這樣的行開始將腳本指向該Python。

例如,如果你正在部署需要docutils代碼,那麼你會做這樣的事情:

cd projectDir 
mkdir -p lib 
tar xzvf ~/Downloads/docutils-0.8.tgz 
mv docutils-0.8/docutils lib 
rm -r docutils-0.8 

然後在此目錄中一個Python模塊只想補充以下在開始:

#!/usr/local/bin/python 

import os 
import sys 
sys.path(os.path.join(os.path.dirname(sys.argv[0]), "lib")) 
import docutils 
+0

這很有趣。那麼我也可以將所有從站點包複製到Lib並執行sys.path?謝謝你的訣竅。如何捆綁我自己的Python版本,如何解決? –

+0

我的答案的第二段。你可能想要使用目標機器上不存在的目錄,例如'/ opt/python2.7',這樣你就不必從其他安裝中挑選出Python的文件。一旦它安裝在你的機器上,'cd/opt; tar cjvf /tmp/python2.7.ta​​r.bz2 python2.7',然後將'/ tmp/python2.7.ta​​r.bz2'發送給他們作爲你的交付的一部分,然後在他們的末尾執行'mkdir -p/opt ; cd/opt; sudo tar xjpf/tmp/python2.7.ta​​r.bz2'來安裝它。然後你的可執行腳本只需要以'#!/ opt/python2.7/bin/python'開頭。 –

+0

非常感謝,一年之後它最有意義。 Virtualenv不適合我的需求。這一個工程。只有一個問題,我應該做靜態編譯的Python蟒蛇一些Linux有不同的Libc –

-4

超級簡單服務器端設置沒有任何理由。

不要浪費時間。

將會發生多少個服務器安裝?不多。

系統管理員希望在基於服務器的應用程序中具有一定程度的複雜性。

您有第三方包列表;他們按照該清單進行安裝。

然後 - 在他們完成所有安裝之後 - 他們安裝並配置您的軟件包。

這就是許多在服務器上工作的系統管理員所期望的。他們期待依賴性,他們期望多步驟安裝。

+2

我並不是那種低調的人,但我很少有幸能在交付的另一端擁有一個知識淵博的系統管理員。通常它是最低等級的軟件人員,他們幾乎不知道如何使用Linux,更不用說安裝它,而不是「放在Fedora光盤中,然後點擊OK」。如果出現問題,他們的程序是1)責備我,所以我必須證明我的送貨沒有錯,然後2)等待他們的傢伙找到有線索的人......而我被指責延誤。有時你需要簡化客戶的部署,只是爲了保持理智。 –

+0

我的系統管理員不信任超級複雜的安裝程序,但需要通過YUM或YAST提供的軟件包基本列表。沒有例外。沒有捆綁。他們不是天才。但是他們需要來自倉庫的軟件包,並且不會從我那裏獲得捆綁安裝。 –

+0

S.Lott,就像我剛纔提到的那樣,是那些遠離我,世界另一端的目標環境中的傢伙。他們有零的Linux知識......所以它必須儘可能簡單。總之,如果我可以將所有東西都打包成zip文件,並讓它們解壓並運行python文件來啓動。那是我需要什麼樣的事情。 –

1

這是一個廣泛的話題,但這裏有一些指針。

對於您的Python項目及其依賴關係,請參閱virtualenvpip

Virtualenv在您的目標平臺上提供了一個獨立的python環境,然後您可以將其安裝到您的項目中。

Pip是一個軟件包安裝工具,它將下載並安裝您的軟件包及其依賴關係。查看pip freeze來提供一種快速定義當前已安裝在開發環境中的依賴項列表的方法。

如果您想了解更多關於Python包分發的知識,那麼您還應該閱讀關於distribute項目的內容。

對於系統的非python組件,包括安裝python本身,可以使用像Puppet這樣的系統自動化工具,但聽起來像它可能會滿足您的需求。如果您正在尋找一步安裝,您應該考慮爲目標系統的package manager構建一個包。

+1

您需要小心下載和安裝依賴項,因爲不能保證您開發的版本是在交付時將下載的版本。當我開發一個使用South 0.6的Django應用程序時,我曾經遇到過這個問題,並且在交付前一天發佈了0.7版本,並做了一些大的API更改,因此部署無效。保持部署的依賴性解決了這個問題。 –

+0

使用virtualenv,它是否可以複製粘貼到另一個服務器的環境(使用相同的OS ofcoz)?我的意思是它包括整個python環境+所有其他必要的軟件包?用PIP。正如Mike DeSimone所說,遇到不兼容問題的可能性(因爲我已經在4臺獨立的服務器上部署了,我已經遇到過2次)。我也會研究傀儡。非常感謝。 –

+0

@ V3ss0n恐怕你不能將一個virtualenv從一臺服務器複製到另一臺服務器,並期望它「只是工作」。查看[this](http://pypi.python.org/pypi/virtualenv#making-environments-relocatable)以獲得更好的解釋。 –

0

我想部署它們在所有的一個模塊中,包括當前使用的Python版本(大多數OS仍然使用Python 2.5,6,我使用2.7和2.7特定功能)。

可能VirtualEnv是你需要的嗎?

+0

哎呀..我在上面看到了很棒的回答。 :) –

+0

VirtualEnv,它是否消除了現有python安裝的需要?我聽說它用於共享主機的Python。 –

+0

不,virtualenv建立在現有python安裝之上,因此需要python已經安裝在系統上。 –

相關問題