1. Distutils 模塊介紹?
本文檔介紹了使用 Distutils 模塊分發(fā)你的 Python 模塊,主要是針對開發(fā)者/分發(fā)者的使用的——如果你想了解如何安裝 Python 模塊,你應(yīng)該參考這個章節(jié): 安裝Python模塊(舊版)。
1.1. 概念和術(shù)語?
Distutils 用起來非常簡單,對于模塊開發(fā)者或安裝第三方模塊的用戶/管理員均是如此。開發(fā)者的責(zé)任(當(dāng)然還有編寫可靠、良好文檔和經(jīng)過良好測試的代碼!)就是:
編寫一個設(shè)置腳本
(可選)編寫設(shè)置腳本的配置文件
創(chuàng)建源碼的發(fā)行版
(可選)創(chuàng)建一個或多個編譯好(二進制)的發(fā)行版
每個這些任務(wù)均已在此文檔覆蓋.
并非所有的模塊開發(fā)者都能接觸到眾多的平臺,所以期望他們創(chuàng)造眾多的內(nèi)置發(fā)行版不是總是可行的。最好是有一類名為 打包者 的中介,以滿足這一需求。打包者將讀取模塊開發(fā)者發(fā)布的源代碼,在一個或多個平臺上進行編譯,并發(fā)布構(gòu)建出來的發(fā)行版。這樣,最流行平臺的用戶就能以最自然的方式安裝最流行的 Python 模塊發(fā)行版,不必運行什么設(shè)置腳本或編譯代碼了。
1.2. 一個簡單的例子?
setup 腳本通常很簡單,盡管是用 Python 編寫的,它能干的事情沒有限制,當(dāng)然應(yīng)小心別在 setup 腳本中加入什么運行緩慢的操作。與 Autoconf 風(fēng)格的 configure 腳本不同,在構(gòu)建和安裝模塊的過程中 setup 腳本可能會被多次運行。
如果只想發(fā)布一個名為 foo 的模塊,位于 foo.py 文件中,那么 setup 腳本可以如此簡單:
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
一些觀察:
提供給 Distutils 的大部分信息將作為關(guān)鍵字參數(shù)發(fā)給
setup()函數(shù)。這些關(guān)鍵字參數(shù)分為兩類:包的元數(shù)據(jù)(名稱、版本號)和包中內(nèi)容的描述信息(本例中是純 Python 模塊的列表)。
模塊由模塊名指定,而不是文件名(包和擴展也是如此)。
建議多提供一些元數(shù)據(jù),特別是開發(fā)者姓名、電子郵件地址和項目的URL(參見 編寫安裝腳本 中的例子)。
要為該模塊創(chuàng)建一個源碼發(fā)布版本,需要創(chuàng)建一段 setup 腳本 setup.py,包含上述代碼,然后從終端運行以下命令:
python setup.py sdist
Windows用戶, 打開命令行窗口 () 并且更改命令為:
setup.py sdist
sdist 將會創(chuàng)建文檔文件 (例如Unix中的tarball,Windows的zip文件) 包含你的配置文件 setup.py, 你的模塊 foo.py. 此文檔文件將會命名為 foo-1.0.tar.gz (or .zip), 并且解包到此目錄 foo-1.0.
如果最終用戶希望安裝 foo 模塊,只需下載 foo-1.0.tar.gz (或 .zip )并解壓,進入 foo-1.0 目錄運行:
python setup.py install
這會把 foo.py 復(fù)制到 Python 安裝環(huán)境的第三方模塊目錄中。
上述簡單例子展示了 Distutils 的一些基本概念。首先,開發(fā)者和安裝者擁有相同的基本用戶界面,即 setup 腳本。區(qū)別在于使用哪種 Distutils 命令 : sdist 命令幾乎只適用于模塊開發(fā)者,而 install 則更適用于安裝者(當(dāng)然大多數(shù)開發(fā)者偶爾也想要安裝自己的代碼)。
If you want to make things really easy for your users, you can create one or more built distributions for them. For instance, if you are running on a Windows machine, and want to make things easy for other Windows users, you can create an executable installer (the most appropriate type of built distribution for this platform) with the bdist_wininst command. For example:
python setup.py bdist_wininst
will create an executable installer, foo-1.0.win32.exe, in the current
directory.
其他有用的內(nèi)置分發(fā)格式是 RPM,可由 bdist_rpm 、Solaris pkgtool`(:command:`bdist_pkgtool)和 HP-UX swinstall`(:command:`bdist_sdux)實現(xiàn)。比如,以下命令將創(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)。
可以隨時運行以下命令,以便了解當(dāng)前可用的分發(fā)格式:
python setup.py bdist --help-formats
1.3. 通用的 Python 術(shù)語?
本文讀者可能對模塊、擴展等已有了很好的理解。但為確保所有人都站在同一起點上,下面提供了 Python 常用術(shù)語表:
- module 模塊
實現(xiàn) Python 代碼重用的基本單位:可被其他代碼導(dǎo)入的一段代碼。有三種類型的模塊與本文有關(guān):純 Python 模塊、擴展模塊和包。
- 純 Python 模塊
用 Python 編寫的模塊,包含在某
.py文件中(可能還會有相關(guān)的.pyc文件)。有時被稱為 "純模塊"。- extension module -- 擴展模塊
用低級語言編寫的 Python 模塊。Python 用 C/C++ ,而 Jython 則用Java。通常包含在一個可動態(tài)加載的預(yù)編譯文件中,比如 Unix 中的 Python 擴展是一個共享對象(
.so)文件,Windows 中的 Python 擴展則是一個 DLL (擴展名為.pyd),而 Jython 的擴展是個 Java class 文件。(注意,目前,Distutils 只能處理 Python 的 C/C++ 擴展。)- package -- 包
包含其他模塊的模塊;通常位于文件系統(tǒng)的某個目錄中,區(qū)別于其他目錄的標記就是存在一個
__init__.py文件。- 根包
包的層次結(jié)構(gòu)的根。(其并非一個真正的包,因為沒有
__init__.py文件。但總得給它起個名字)。 絕大多數(shù)標準庫都在根包中,還有許多不屬于任何大型模塊的小型、獨立的第三方模塊。與普通的包不同,根包中的模塊可能會在很多目錄中出現(xiàn):事實上,sys.path列出的每個目錄都會為根包提供模塊。
1.4. Distutils 特定的術(shù)語?
以下屬于更加特別地用于 Distutils 發(fā)布 Python 模塊。
- 模塊的發(fā)布
一組 Python 模塊,作為可下載的資源組團發(fā)布,以便 大規(guī)模 安裝。模塊發(fā)布版的著名例子是 NumPy 、 SciPy 、 Pillow 或 mxBase。(這些會被稱為 package,這個詞在 Python 的語境中也使用過:一個模塊發(fā)行版可能包含零個、一個或多個 Python 包。)
- 純模塊發(fā)行版
只包含純 Python 模塊和軟件包的模塊發(fā)布版。有時被稱為“純發(fā)行版”。
- 非純模塊發(fā)行版
至少包含一個擴展模塊的模塊發(fā)行版。 有時被稱為“非純發(fā)行版”。
- 根發(fā)行版
源代碼樹(或源代碼發(fā)行版)的頂級目錄;即
setup.py所在的目錄。 一般來說,setup.py會在該目錄下運行。
