翻譯自官方文檔
本文檔從模塊開發(fā)人員的角度描述了Python Distribution Utilities(“Distutils”),介紹了如何使用Distutils將Python模塊和擴展程序提供給更加廣泛的使用者,并使得構(gòu)建/釋放/安裝機制的開銷很少。
概念&術(shù)語
對于模塊開發(fā)人員和安裝第三方模塊的用戶/管理員來說,使用Distutils是非常簡單的。作為一名開發(fā)人員,您的責(zé)任(當(dāng)然除了編寫可靠的,有詳細(xì)記錄和經(jīng)過良好測試的代碼)是:
- 寫一個安裝腳本(按照慣例為setup.py)
- (可選)寫入設(shè)置配置文件
- 建立一個源碼分發(fā)包
- (可選)創(chuàng)建一個或多個內(nèi)置(二進制)分發(fā)包
這些都會在本文檔中一一提到。
并不是所有的模塊開發(fā)人員都可以訪問多種平臺,因此總想著他們可以創(chuàng)建大量的內(nèi)置分發(fā)包是不可行的。希望出現(xiàn)一類稱為“packagers”的中介機構(gòu),以滿足這一需求。packagers將采用模塊開發(fā)人員發(fā)布的源代碼,將其構(gòu)建在一個或多個平臺上,并發(fā)布生成的內(nèi)置分發(fā)包。因此,最流行的平臺上的用戶將能夠以最自然的方式為他們的平臺安裝大多數(shù)流行的Python模塊分發(fā)包,而無需運行單個安裝腳本或編譯一行代碼。
一個簡單實例
安裝腳本通常非常簡單,盡管由Python編寫,但是對于可以使用的腳本沒有任何限制,可還是要在安裝腳本中應(yīng)該謹(jǐn)慎處理那些重要的操作。 與Autoconf風(fēng)格的配置腳本不同的是,在構(gòu)建和安裝模塊分發(fā)包的過程中,安裝腳本可能會多次運行。
如果你想做的只是分發(fā)一個包含在foo.py文件中的foo模塊,那么你的安裝腳本就可以這么簡單:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
一些需要注意的地方:
您提供給
Distutils的大多數(shù)信息都作為關(guān)鍵字參數(shù)提供給setup()函數(shù)這些關(guān)鍵字參數(shù)分為兩類:包元數(shù)據(jù)(名稱,版本號)以及有關(guān)軟件包內(nèi)容的信息(在這種情況下是純
Python模塊的列表)模塊由模塊名稱指定,而不是文件名(對于包和擴展名也是如此)
建議您提供更多元數(shù)據(jù),特別是您的名稱,電子郵件地址和項目的URL(請參閱編寫安裝腳本一節(jié))
如果要將源碼進行分發(fā),你需要在setup.py寫入上述代碼,并從命令行處運行:
python setup.py sdist
對于Windows用戶來說,你需要執(zhí)行:
setup.py sdist
sdist將創(chuàng)建一個存檔文件(例如,Unix上的tarball文件,Windows上的ZIP文件),其中包含您的安裝腳本setup.py和您的模塊foo.py。 歸檔文件將被命名為foo-1.0.tar.gz(或.zip),并將打包到目錄foo-1.0中。
如果最終用戶希望安裝您的foo模塊,那么她所要做的就是下載foo-1.0.tar.gz(或.zip),解壓縮,并從foo-1.0目錄運行:
python setup.py install
這將最終將foo.py復(fù)制到Python安裝中的第三方模塊的相應(yīng)目錄。
這個簡單的例子演示了Distutils的一些基本概念。 首先,開發(fā)人員和安裝人員都有相同的基本用戶界面,即安裝腳本。 區(qū)別在于Distutils使用的命令:sdist命令幾乎專門用于模塊開發(fā)人員,而安裝程序更常用于安裝程序(盡管大多數(shù)開發(fā)人員都希望偶爾安裝自己的代碼)。
如果你想為用戶做一些簡單的事情,你可以為他們創(chuàng)建一個或多個內(nèi)置(二進制)的分發(fā)包。 例如,如果您正在Windows機器上運行,并希望為其他Windows用戶提供方便,則可以使用bdist_wininst命令創(chuàng)建一個可執(zhí)行安裝程序(這個平臺最合適的構(gòu)建版本的類型)。 例如:
python setup.py bdist_wininst
這將在當(dāng)前目錄中創(chuàng)建可執(zhí)行安裝程序foo-1.0.win32.exe。
其他有用的內(nèi)置分發(fā)格式是RPM。 例如,以下命令將創(chuàng)建一個名為foo-1.0.noarch.rpm的RPM文件:
python setup.py bdist_rpm
注:bdist_rpm命令使用rpm可執(zhí)行文件,因此必須在基于RPM的系統(tǒng)上運行,如Red Hat Linux,SuSE Linux或Mandrake Linux。
python setup.py bdist --help-formats
你可以通過這條指令來查看運行了什么樣的分發(fā)格式。
常用的Python術(shù)語
模塊(module):Python中代碼可重用性的基本單位:由一些其他代碼導(dǎo)入的代碼塊。 這里涉及到三種類型的模塊:純Python模塊(Python modules),擴展模塊(extension modules)和包(packages)。
純Python模塊(Python modules):一個用Python編寫并包含在一個.py文件中的模塊(也可能是關(guān)聯(lián)的.pyc和/或.pyo文件)。 有時被稱為“純模塊”。
擴展模塊(extension modules):一個用Python實現(xiàn)的低級語言編寫的模塊:C / C ++ for Python,Java for Jython。 通常包含在單個可動態(tài)加載的預(yù)編譯文件中。 Unix上的Python擴展的共享對象(.so)文件,Windows上的Python擴展的DLL(給定.pyd擴展名)或Jython擴展的Java類文件。 (請注意,目前,Distutils僅處理Python的C / C ++擴展。)
包(packages):包含其他模塊的模塊; 通常包含在文件系統(tǒng)中的目錄中,并通過存在文件__init__.py與其他目錄區(qū)分開來。
根包(root packages):
包的層次結(jié)構(gòu)的根。 (這不是一個包,因為它沒有一個__init__.py文件,但我們必須稱之為一些)。絕大多數(shù)的標(biāo)準(zhǔn)庫是根包,許多小的,獨立的第三個 不屬于較大模塊集合的一個模塊。 與常規(guī)包不同,根包中的模塊可以在許多目錄中找到:實際上,sys.path中列出的每個目錄都向根包提供模塊。
Distutils特定術(shù)語
以下術(shù)語更具體地適用于使用Distutils分發(fā)Python模塊的方面:
模塊分發(fā)包:作為一個可下載的資源一起分發(fā)的Python模塊的集合,并且要大量安裝。一些眾所周知的模塊分布的例子有數(shù)字Python,PyXML,PIL(Python影像庫)或mxBase。 (這將被稱為包,除了該術(shù)語已經(jīng)在Python上下文中:單個模塊分發(fā)可能包含零個,一個或多個Python包。)
純模塊分發(fā)包:一個僅包含純Python模塊和包的模塊分發(fā)。有時被稱為“純分配”。
非純模塊分發(fā)包:一個包含至少一個擴展模塊的模塊分發(fā)。有時被稱為“非純分配”。
根分發(fā)包:源樹(或源分發(fā))的頂層目錄; setup.py存在的目錄。一般來說,setup.py將從此目錄運行。