解析Python編程中的包結構

來源:互聯網
上載者:User
假設你想設計一個模組集(也就是一個“包”)來統一處理音效檔和聲音資料。通常由它們的擴充有不同的聲音格式,例如:WAV,AIFF,AU),所以你可能需要建立和維護一個不斷增長的各種檔案格式之間的轉換的模組集合。並且可能要執行聲音資料處理(如混合,添加回聲,應用平衡功能),所以你寫一個永無止境的流模組來執行這些操作:模組設計的包如下:

sound/             Top-level package   __init__.py        Initialize the sound package   formats/         Subpackage for file format conversions       __init__.py       wavread.py       wavwrite.py       aiffread.py       aiffwrite.py       auread.py       auwrite.py       ...   effects/         Subpackage for sound effects       __init__.py       echo.py       surround.py       reverse.py       ...   filters/         Subpackage for filters       __init__.py       equalizer.py       vocoder.py       karaoke.py       ...

當匯入包以後,Python通過sys.path中的目錄來尋找包的子目錄。 每一個包都必須有__init__.py檔案,這樣做是為了防止某些目錄有一個共同的名字。在最簡單的情況下,__ init__.py可以只是一個空檔案,但它也可以執行包的初始化代碼,包括設定__all__變數,稍後介紹。 我們可以從包中匯入單個模組,

例如: import sound.effects.echo 這會載入子模組sound.effects.echo。它必須引用全名。

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

另外一種匯入子模組的方法: from sound.effects import echo 這樣就載入了echo子模組,沒有包括包的首碼,因此它可以用作如下:

echo.echofilter(input, output, delay=0.7, atten=4)

或者可以

from sound.effects.echo import echofilter echofilter(input, output, delay=0.7, atten=4)

請注意,如果你使用包匯入一個子模組(或子包),像一個函數,類或變數。 import語句首先測試匯入的對象是否包中定義,如果沒有,它假定這是一個模組,並嘗試載入它。如果還沒有找到,則會引發一個ImportError異常。

python 包管理工具大亂鬥
1. distutils

distutils 是 python 標準庫的一部分,2000年發布。使用它能夠進行 python 模組的 安裝 和 發布。

setup.py 就是利用 distutils 的功能寫成,我們可以看一個簡單的 setup.py 的例子。

在這裡可以看到關於 setupt.py 格式的所有詳細描述:Writing the Setup Script。

要安裝一個模組到當前的 python 環境中,可以使用這個模組提供的 setup.py 檔案:

python setup.py install

下面的代碼會發布一個 python 模組,將其打包成 tar.gz 或者 zip 壓縮包:

python setup.py sdist

甚至能打包成 rpm 或者 exe 安裝包:

python setup.py bdist_rpmpython setup.py bdist_wininst

2. setuptools 和 distribute

setuptools 是一個為了增強 distutils 而開發的集合,2004年發布。它包含了 easy_install 這個工具。

ez_setup.py 是 setuptools 的安裝工具。ez 就是 easy 的縮寫。

簡單的說,setuptools 是一個項目的名稱,是基礎組件。而 easy_install 是這個項目中提供的工具,它依賴基礎組件工作。

為了方便描述,下面文章中提到的 setuptools 被認為與 easy_install 同義。

使用 setuptools 可以自動 下載、構建、安裝和管理 python 模組。

例如,從 PyPI 上安裝一個包:

easy_install SQLObject

下載一個包檔案,然後安裝它:

easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

從一個 .egg 格式安裝:

easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

distribute 是 setuptools 的一個分支版本。分支的原因可能是有一部分開發人員認為 setuptools 開發太慢了。但現在,distribute 又合并回了 setuptools 中。因此,我們可以認為它們是同一個東西。事實上,如果你查看一下 easy_install 的版本,會發現它本質上就是 distribute 。

# easy_install --versiondistribute 0.6.28

3. Eggs

Eggs 格式是 setuptools 引入的一種檔案格式,它使用 .egg 副檔名,用於 Python 模組的安裝。

setuptools 可以識別這種格式。並解析它,安裝它。

4. pip

注意,從此處開始,easy_install 和 setuptools 不再同義。

pip 是目前 python 包管理的事實標準,2008年發布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 組件之上。

pip 希望不再使用 Eggs 格式(雖然它支援 Eggs),而更希望採用“源碼發行版”(使用 python setup.py sdict 建立)。這可以充分利用 Requirements File Format 提供的方便功能。

pip 可以利用 requirments.txt 來實現在依賴的安裝。在 setup.py 中,也存在一個 install_requires 表來指定依賴的安裝。

pip 支援 git/svn/hg 等流行的 VCS 系統,可以直接從 gz 或者 zip 壓縮包安裝,支援搜尋包,以及指定伺服器安裝等等功能。

pip vs easy_install 詳細介紹了兩者的不同。它們可以說是各占勝場,但 pip 明顯優勢更大。

5. wheel

wheel 本質上是一個 zip 包格式,它使用 .whl 副檔名,用於 python 模組的安裝,它的出現是為了替代 Eggs。

wheel 還提供了一個 bdist_wheel 作為 setuptools 的擴充命令,這個命令可以用來產生 wheel 包。

pip 提供了一個 wheel 子命令來安裝 wheel 包。當然,需要先安裝 wheel 模組。

setup.cfg 可以用來定義 wheel 打包時候的相關資訊。

Wheel vs Egg 詳細介紹了 wheel 和 Eggs 格式的區別,很顯然,wheel 優勢明顯。

Python Wheels 網站展示了使用 Wheels 發行的 python 模組在 PyPI 上的佔有率。

pypip.in 也支援 wheel。

6. distutils2 和 distlib

distutils2 被設計為 distutils 的替代品。從2009年開發到2012年。它包含更多的功能,並希望以 packaging 作為名稱進入 python 3.3 成為標準庫的一部分。但這個計劃 後來停滯了 。

distlib 是 distutils2 的部分,它為 distutils2/packaging 提供的低級功能增加進階 API,使其便於使用。

這裡 介紹了 distlib 沒有進入 python 3.3 標準庫的一些原因。

因此,可以暫時不必瞭解這兩個工具,靜觀其變即可。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.