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)命令行窗口(Start ? Accessories)并且寫(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ì )在該目錄下運行。