如何在Linux中分發獨立Python應用程序?Linux中的獨立Python應用程序
我想我可以理所當然地認爲最近在任何現代發行版中都有Python解釋器。問題在於處理那些不屬於標準庫的庫,例如wxPython,scipy,python密碼工具包,reportlab等等。
是否有一個工作的Linux對應py2exe(順便說一句,我從來沒有嘗試過)? 是否有免費的開源軟件?
如何在Linux中分發獨立Python應用程序?Linux中的獨立Python應用程序
我想我可以理所當然地認爲最近在任何現代發行版中都有Python解釋器。問題在於處理那些不屬於標準庫的庫,例如wxPython,scipy,python密碼工具包,reportlab等等。
是否有一個工作的Linux對應py2exe(順便說一句,我從來沒有嘗試過)? 是否有免費的開源軟件?
沒有。
Python對於不同的設置而言是臭名昭着的片狀。部署python應用程序的唯一理智方式是將所有依賴於您的代碼的解釋器和庫發送出去。這很可能會起作用。
你不能輕易地以分佈中立的格式來做到這一點。唯一可靠的依賴關係跟蹤機制內置於分發包管理系統中,並且隨分發而變化。你將不得不爲Fedora做rpm,debs for ubuntu和debian等。
Py2exe在Windows上正常工作。它使用所有必需的DLL和用於啓動程序的python解釋器的封裝來構建一個發行版。安裝相當簡單 - 只需將其放置在目錄中即可 - 因此爲其製作msi文件很簡單。
您可能想看看setuptools中的依賴聲明。這可以提供一種方法來確保正確的軟件包可以在環境中使用,或者可以由具有適當權限的人員安裝。
我知道@ S.Lott知道這一點,但對於其他人:這是一種將Python庫或應用程序分發給其他開發人員的好方法,他們不會介意在應用程序工作之前必須自己安裝正確版本的Python。但是,向最終用戶分發絕對是錯誤的方式,他們不知道Python是什麼,絕對不會去安裝它來讓你的應用程序工作,對於0.2%的人來說,他們會安裝錯誤的版。 – 2015-08-21 07:45:19
創建一個Deb(對於Debian派生的所有內容)和一個rpm(對於Fedora/SuSE)。將正確的依賴關係添加到包裝中,您可以合理確信它會起作用。
Setuptools對我來說太過分了,因爲我的程序的使用非常有限,所以這裏是我自己開發的選擇。
我捆綁包含所有先決條件的「第三方」目錄,並使用site.addsitedir,因此不需要全局安裝它們。
# program startup code
import os
import sys
import site
path = os.path.abspath(os.path.dirname(__file__))
ver = 'python%d.%d' % sys.version_info[:2]
thirdparty = os.path.join(path, 'third-party', 'lib', ver, 'site-packages')
site.addsitedir(thirdparty)
我的大多數先決條件都有setup.py安裝程序。每個捆綁的模塊都有自己的「安裝」過程,所以任何自定義的東西(例如./configure)都可以自動運行。我的安裝腳本運行這個makefile作爲安裝過程的一部分。
# sample third-party/Makefile
PYTHON_VER = `python -c "import sys; \
print 'python%d.%d' % sys.version_info[:2]"`
PYTHON_PATH = lib/$(PYTHON_VER)/site-packages
MODS = egenix-mx-base-3.0.0 # etc
.PHONY: all init clean realclean $(MODS)
all: $(MODS)
$(MODS): init
init:
mkdir -p bin
mkdir -p $(PYTHON_PATH)
clean:
rm -rf $(MODS)
realclean: clean
rm -rf bin
rm -rf lib
egenix-mx-base-3.0.0:
tar xzf [email protected]
cd [email protected] && python setup.py install --prefix=..
rm -rf [email protected]
標準的python方法是創建一個python「蛋」。
您可以使用cx_Freeze來執行此操作。它就像py2exe(將解釋器和啓動腳本以及所有必需的庫和模塊捆綁在一起),但可在Linux和Windows上運行。
它從運行環境收集依賴關係,這意味着它們也需要適合目標。如果你正在做一些像在32位Debian上構建和部署在另一個32位Debian上的東西,那很好。您可以在適當的環境中構建多個版本(例如32位和64位chroot)並分發相應的版本,以處理32/64位差異。如果你想要更通用的東西(例如在Debian上構建,部署在任何發行版上),那麼這會有點模糊,具體取決於你的依賴關係。
如果你正在做一個相當直接的發佈(即你知道你的構建環境和部署環境相似),那麼這可以避免相當複雜的rpm/deb/egg/etc步驟(使用cx_Freeze非常容易,尤其是如果你熟悉py2exe)。如果不是,那麼根據你想做多少工作,你想提供的所需版本有多大的靈活性,以及依賴關係是什麼,那麼從你自己的依賴安裝程序到deb/rpm/egg/etc構建的任何事情都可以工作。
我認爲您可以在大多數現代Linux發行版上相當安全地採用理所當然的python支持 - 只要給出了理智的錯誤消息,那麼用戶應該能夠如何自行獲取(你可以使用這個簡單的bash啓動腳本):
#!/bin/bash
if [ -e /usr/bin/python ]
then
echo "Python found!"
else
echo "Python missing!"
fi
這不是我的經驗。當然你可以錯誤地設置第三方庫,甚至不正確地安裝python,但通常我從來沒有遇到過標準python程序的問題。當然,當你使用新的功能時,轉移到以前的版本:)。也許你正在考慮Java(TM)? – 2010-01-06 13:20:04
@ A.L.Flanagan:其實,對於我討厭Java的人來說,我發現它對於軟件發行來說非常強大。 – Marcin 2012-01-25 11:51:07