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