Python 分發工具初探之 setuptools

發表於2016-03-29

這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。

0x00 setuptools 是什麼

setuptools 與 disutils

我們通常所知道的 Python 分發工具是 Python distutils, setuptools 可以說是它的增強版,它能幫助我們更好的建立和分發 Python 的包,尤其是具有複雜依賴關係的包。對於開發者來說,能夠更好的組織自己專案的分發和釋出;對於使用者來說,不需要安裝 setuptools 也可以使用由它建立的包,只需要一個啟動模組即可。

實現這樣的的包管理機制主要由兩部分構成:

  • 一個儲存在 Python 官方網站的集中式倉庫,名叫 Python Package Index(PyPI)
  • 另外就是基於 distutils 開發的 setuptools 包管理系統

它提供的內容包括:

  • 用來提供標準後設資料欄位:諸如作者名、版權型別等資訊的骨架
  • 一組用來將包中的程式碼來構建軟體安裝包的輔助工具

distutils 僅僅適用於包,它無法定義包之間的依賴關係。但是 setuptools 通過新增一個基本的依賴系統以及許多相關功能,彌補了該缺陷。他還提供了自動包查詢程式,用來自動獲取包之間的依賴關係,並完成這些包的安裝,大大降低了安裝各種包的難度,使之更加方便。

相關功能

  • 利用 EasyInstall 自動查詢、下載、安裝升級依賴包
  • 能夠建立 Python Eggs、
  • 包含目錄中的資料檔案和包,不需要在 setup() 函式中一一列舉出來
  • 自動包含包內和釋出有關的所有相關檔案,而不用建立一個 MANIFEST.in檔案
  • 自動生成經過包裝的指令碼
  • 支援Pyrex,即在可以 setup.py 中列出 .pyx 檔案,而終端使用者無須安裝Pyrex
  • 支援上傳到 PyPI
  • 可以部署開發模式,使專案在sys.path中
  • 用新命令或 setup() 引數擴充套件distutils,為多個專案釋出/重用擴充套件
  • 在專案的 setup()中簡單宣告 entry points,建立可以自動發現擴充套件的應用和框架

0x01 安裝 setuptools

Ubuntu:

Mac:

安裝 wget:

安裝 setuputils:

0x02 建立一個簡單的包

建立一個空的包

新建一個 demo 目錄

在目錄下新建 setup.py 檔案

將該專案打包

這時我們檢視該專案目錄:

我們看到在 dist 目錄中的就是生成的 egg 包,將其解壓:

以上的程式是最簡單的一個 setup.py 程式,如果想要釋出到 PyPI 就需要參考官方給出的示例

給包中新增內容

我們上邊生成的 egg 是一個空的,沒有實際的內容,現在我們來新增一些內容:

在專案目錄新建一個目錄:

新建 __init__.py,加入如下程式碼:

再次生成 egg 包:

檢視 egg 包內容:

我們看到其中已經多了 test 目錄和 __init__.py,然後我們就可以嘗試安裝一下我們自己的包:

然後該包就會安裝到 Python 的 site-packages 目錄下,在我的電腦上為 /Library/Python/2.7/site-packages/demo1-0.1-py2.7.egg

這時我們可以在 Python 終端測試我們的包:

我們看到我們編寫的包已經成功執行!

0x02 總結

這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。

 

相關文章