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 用戶來說,打開命令行窗口(Start ? Accessories)并且寫上如下命令:

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)行。