這篇文章主要介紹了一下 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:
1 |
sudo apt-get install python-setuptools |
Mac:
安裝 wget:
|
安裝 setuputils:
|
0x02 建立一個簡單的包
建立一個空的包
新建一個 demo 目錄
|
在目錄下新建 setup.py
檔案
1 2 3 4 5 6 7 |
from setuptools import setup, find_packages setup( name = 'demo1', version = '0.1', packages = find_packages(), ) |
將該專案打包
|
這時我們檢視該專案目錄:
|
我們看到在 dist
目錄中的就是生成的 egg 包,將其解壓:
|
以上的程式是最簡單的一個 setup.py
程式,如果想要釋出到 PyPI 就需要參考官方給出的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from setuptools import setup, find_packages setup( name = "HelloWorld", version = "0.1", packages = find_packages(), scripts = ['say_hello.py'], # Project uses reStructuredText, so ensure that the docutils get # installed or upgraded on the target machine install_requires = ['docutils>=0.3'], package_data = { # If any package contains *.txt or *.rst files, include them: '': ['*.txt', '*.rst'], # And include any *.msg files found in the 'hello' package, too: 'hello': ['*.msg'], }, # metadata for upload to PyPI author = "Me", author_email = "me@example.com", description = "This is an Example Package", license = "PSF", keywords = "hello world example examples", url = "http://example.com/HelloWorld/", # project home page, if any # could also include long_description, download_url, classifiers, etc. ) |
給包中新增內容
我們上邊生成的 egg 是一個空的,沒有實際的內容,現在我們來新增一些內容:
在專案目錄新建一個目錄:
|
新建 __init__.py
,加入如下程式碼:
1 2 3 4 5 6 7 |
#-*- coding:utf-8 -*- def test(): print "hello world!" if __name__ == '__main__': test() |
再次生成 egg 包:
1 |
python setup.py bdist_egg |
檢視 egg 包內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
unzip -l demo1-0.1-py2.7.egg Archive: demo1-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-22-16 23:51 EGG-INFO/dependency_links.txt 177 03-22-16 23:51 EGG-INFO/PKG-INFO 141 03-22-16 23:51 EGG-INFO/SOURCES.txt 5 03-22-16 23:51 EGG-INFO/top_level.txt 1 03-22-16 23:51 EGG-INFO/zip-safe 102 03-22-16 23:48 test/__init__.py 354 03-22-16 23:51 test/__init__.pyc -------- ------- 781 7 files |
我們看到其中已經多了 test
目錄和 __init__.py
,然後我們就可以嘗試安裝一下我們自己的包:
|
然後該包就會安裝到 Python 的 site-packages
目錄下,在我的電腦上為 /Library/Python/2.7/site-packages/demo1-0.1-py2.7.egg
這時我們可以在 Python 終端測試我們的包:
我們看到我們編寫的包已經成功執行!
0x02 總結
這篇文章主要介紹了一下 setuptools 是什麼,以及它的功能和特點,並且介紹瞭如何使用它來建立和安裝使用自己的包,這篇文章僅僅講了最基本的功能和用法,一些對於進階的用法會在下篇文章中進行介紹。