1. Distutils 模塊介紹?

本文檔介紹了使用 Distutils 模塊分發(fā)你的 Python 模塊,主要是針對(duì)開(kāi)發(fā)者/分發(fā)者的使用的——如果你想了解如何安裝 Python 模塊,你應(yīng)該參考這個(gè)章節(jié): 安裝Python模塊(舊版)

1.1. 概念和術(shù)語(yǔ)?

Distutils 用起來(lái)非常簡(jiǎn)單,對(duì)于模塊開(kāi)發(fā)者或安裝第三方模塊的用戶/管理員均是如此。開(kāi)發(fā)者的責(zé)任(當(dāng)然還有編寫可靠、良好文檔和經(jīng)過(guò)良好測(cè)試的代碼!)就是:

  • 編寫一個(gè)設(shè)置腳本

  • (可選)編寫設(shè)置腳本的配置文件

  • 創(chuàng)建源碼的發(fā)行版

  • (可選)創(chuàng)建一個(gè)或多個(gè)編譯好(二進(jìn)制)的發(fā)行版

每個(gè)這些任務(wù)均已在此文檔覆蓋.

并非所有的模塊開(kāi)發(fā)者都能接觸到眾多的平臺(tái),所以期望他們創(chuàng)造眾多的內(nèi)置發(fā)行版不是總是可行的。最好是有一類名為 打包者 的中介,以滿足這一需求。打包者將讀取模塊開(kāi)發(fā)者發(fā)布的源代碼,在一個(gè)或多個(gè)平臺(tái)上進(jìn)行編譯,并發(fā)布構(gòu)建出來(lái)的發(fā)行版。這樣,最流行平臺(tái)的用戶就能以最自然的方式安裝最流行的 Python 模塊發(fā)行版,不必運(yùn)行什么設(shè)置腳本或編譯代碼了。

1.2. 一個(gè)簡(jiǎn)單的例子?

setup 腳本通常很簡(jiǎn)單,盡管是用 Python 編寫的,它能干的事情沒(méi)有限制,當(dāng)然應(yīng)小心別在 setup 腳本中加入什么運(yùn)行緩慢的操作。與 Autoconf 風(fēng)格的 configure 腳本不同,在構(gòu)建和安裝模塊的過(guò)程中 setup 腳本可能會(huì)被多次運(yùn)行。

如果只想發(fā)布一個(gè)名為 foo 的模塊,位于 foo.py 文件中,那么 setup 腳本可以如此簡(jiǎn)單:

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ù)(名稱、版本號(hào))和包中內(nèi)容的描述信息(本例中是純 Python 模塊的列表)。

  • 模塊由模塊名指定,而不是文件名(包和擴(kuò)展也是如此)。

  • 建議多提供一些元數(shù)據(jù),特別是開(kāi)發(fā)者姓名、電子郵件地址和項(xiàng)目的URL(參見(jiàn) 編寫安裝腳本 中的例子)。

要為該模塊創(chuàng)建一個(gè)源碼發(fā)布版本,需要?jiǎng)?chuàng)建一段 setup 腳本 setup.py,包含上述代碼,然后從終端運(yùn)行以下命令:

python setup.py sdist

Windows用戶, 打開(kāi)命令行窗口 (Start ? Accessories) 并且更改命令為:

setup.py sdist

sdist 將會(huì)創(chuàng)建文檔文件 (例如Unix中的tarball,Windows的zip文件) 包含你的配置文件 setup.py, 你的模塊 foo.py. 此文檔文件將會(huì)命名為 foo-1.0.tar.gz (or .zip), 并且解包到此目錄 foo-1.0.

如果最終用戶希望安裝 foo 模塊,只需下載 foo-1.0.tar.gz (或 .zip )并解壓,進(jìn)入 foo-1.0 目錄運(yùn)行:

python setup.py install

這會(huì)把 foo.py 復(fù)制到 Python 安裝環(huán)境的第三方模塊目錄中。

上述簡(jiǎn)單例子展示了 Distutils 的一些基本概念。首先,開(kāi)發(fā)者和安裝者擁有相同的基本用戶界面,即 setup 腳本。區(qū)別在于使用哪種 Distutils 命令sdist 命令幾乎只適用于模塊開(kāi)發(fā)者,而 install 則更適用于安裝者(當(dāng)然大多數(shù)開(kāi)發(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)實(shí)現(xiàn)。比如,以下命令將創(chuàng)建一個(gè)名為 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)。

可以隨時(shí)運(yùn)行以下命令,以便了解當(dāng)前可用的分發(fā)格式:

python setup.py bdist --help-formats

1.3. 通用的 Python 術(shù)語(yǔ)?

本文讀者可能對(duì)模塊、擴(kuò)展等已有了很好的理解。但為確保所有人都站在同一起點(diǎn)上,下面提供了 Python 常用術(shù)語(yǔ)表:

module 模塊

實(shí)現(xiàn) Python 代碼重用的基本單位:可被其他代碼導(dǎo)入的一段代碼。有三種類型的模塊與本文有關(guān):純 Python 模塊、擴(kuò)展模塊和包。

純 Python 模塊

用 Python 編寫的模塊,包含在某 .py 文件中(可能還會(huì)有相關(guān)的 .pyc 文件)。有時(shí)被稱為 "純模塊"。

extension module -- 擴(kuò)展模塊

用低級(jí)語(yǔ)言編寫的 Python 模塊。Python 用 C/C++ ,而 Jython 則用Java。通常包含在一個(gè)可動(dòng)態(tài)加載的預(yù)編譯文件中,比如 Unix 中的 Python 擴(kuò)展是一個(gè)共享對(duì)象(.so)文件,Windows 中的 Python 擴(kuò)展則是一個(gè) DLL (擴(kuò)展名為 .pyd ),而 Jython 的擴(kuò)展是個(gè) Java class 文件。(注意,目前,Distutils 只能處理 Python 的 C/C++ 擴(kuò)展。)

package -- 包

包含其他模塊的模塊;通常位于文件系統(tǒng)的某個(gè)目錄中,區(qū)別于其他目錄的標(biāo)記就是存在一個(gè) __init__.py 文件。

根包

包的層次結(jié)構(gòu)的根。(其并非一個(gè)真正的包,因?yàn)闆](méi)有 __init__.py 文件。但總得給它起個(gè)名字)。 絕大多數(shù)標(biāo)準(zhǔn)庫(kù)都在根包中,還有許多不屬于任何大型模塊的小型、獨(dú)立的第三方模塊。與普通的包不同,根包中的模塊可能會(huì)在很多目錄中出現(xiàn):事實(shí)上,sys.path 列出的每個(gè)目錄都會(huì)為根包提供模塊。

1.4. Distutils 特定的術(shù)語(yǔ)?

以下屬于更加特別地用于 Distutils 發(fā)布 Python 模塊。

模塊的發(fā)布

一組 Python 模塊,作為可下載的資源組團(tuán)發(fā)布,以便 大規(guī)模 安裝。模塊發(fā)布版的著名例子是 NumPy 、 SciPy 、 Pillow 或 mxBase。(這些會(huì)被稱為 package,這個(gè)詞在 Python 的語(yǔ)境中也使用過(guò):一個(gè)模塊發(fā)行版可能包含零個(gè)、一個(gè)或多個(gè) Python 包。)

純模塊發(fā)行版

只包含純 Python 模塊和軟件包的模塊發(fā)布版。有時(shí)被稱為“純發(fā)行版”。

非純模塊發(fā)行版

至少包含一個(gè)擴(kuò)展模塊的模塊發(fā)行版。 有時(shí)被稱為“非純發(fā)行版”。

根發(fā)行版

源代碼樹(shù)(或源代碼發(fā)行版)的頂級(jí)目錄;即 setup.py 所在的目錄。 一般來(lái)說(shuō),setup.py 會(huì)在該目錄下運(yùn)行。