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