在上篇文章中我們知道了 setuptools 是什麼,以及它基本的功能和用法。在這篇文章中,我們會介紹如何講setuptools應用於稍大的專案中,通過 setuptools 控制包中的檔案。
0x03 使用 find_packages()
在之前的例子中,我們使用的都是 setup()
的預設引數,使用預設引數只能打包一些簡單的、不復雜的工程,如果我們的工程中的檔案越來越多,就不能使用它的預設引數了。
現在我們來建這樣一個工程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
. ├── setup.py └── src ├── demo.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ └── top_level.txt └── test ├── __init__.py ├── a.txt └── data ├── data1.dat └── data2.dat 4 directories, 9 files |
如果像之前那樣使用 setup()
的預設引數來進行打包,我們會看到的 egg 如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
Archive: demo1-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-25-16 20:27 EGG-INFO/dependency_links.txt 177 03-25-16 20:27 EGG-INFO/PKG-INFO 141 03-25-16 20:27 EGG-INFO/SOURCES.txt 5 03-25-16 20:27 EGG-INFO/top_level.txt 1 03-25-16 20:27 EGG-INFO/zip-safe 102 03-22-16 23:48 test/__init__.py 354 03-25-16 20:27 test/__init__.pyc -------- ------- 781 7 files |
依然是隻有 __init__.py
,如果我們要想把上邊目錄中的 .txt
檔案和 /data
下的 .dat
檔案也包含到我們的egg包中,我們需要修改 setup.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#-*- coding:utf-8 -*- from setuptools import setup, find_packages setup( name = "demo", version = "0.1", # 包含所有src目錄下的包 packages = find_packages('src'), package_dir = {'':'src'}, package_data = { # 包含所有.txt檔案 '':['*.txt'], # 包含data目錄下所有的.dat檔案 'test':['data/*.dat'], } ) |
這時我們再看一下 egg 包中的內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Archive: demo-0.1-py2.7.egg Length Date Time Name -------- ---- ---- ---- 1 03-25-16 20:47 EGG-INFO/dependency_links.txt 176 03-25-16 20:47 EGG-INFO/PKG-INFO 220 03-25-16 20:47 EGG-INFO/SOURCES.txt 5 03-25-16 20:47 EGG-INFO/top_level.txt 1 03-25-16 20:47 EGG-INFO/zip-safe 102 03-22-16 23:48 test/__init__.py 354 03-25-16 20:47 test/__init__.pyc 0 03-25-16 17:24 test/a.txt 0 03-25-16 17:24 test/data/data1.dat 0 03-25-16 17:24 test/data/data2.dat -------- ------- 859 10 files |
我們也可以排除掉某些檔案:
1 |
find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) |
0x04 使用 entry_points
entry_points 是一個字典,從entry point組名對映道一個表示entry point的字串或字串列表。Entry points是用來支援動態發現服務和外掛的,也用來支援自動生成指令碼。
比如說:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
setup( entry_points = { 'console_scripts': [ 'foo = demo:test', 'bar = demo:test', ], 'gui_scripts': [ 'baz = demo:test', ] } ) 我們再安裝這個 egg,會發現在安裝過程中會出現: ```bash Installing foo script to /usr/local/bin Installing bar script to /usr/local/bin |
檢視 /usr/local/bin/foo
內容:
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/python # EASY-INSTALL-ENTRY-SCRIPT: 'demo==0.1','console_scripts','foo' __requires__ = 'demo==0.1' import sys from pkg_resources import load_entry_point if __name__ == '__main__': sys.exit( load_entry_point('demo==0.1', 'console_scripts', 'foo')() ) |
這個內容其實顯示的意思是,foo將執行 console_scripts
中定義的foo所代表的函式。執行foo,發現打出了 hello world!
,和預期結果一樣。
0x05 總結
這篇文章介紹了一些 setuptools 比較進階的使用方法,對於更詳細的其他用法,詳見官方文件