Python 分發工具初探之 setuptools 進階

在上篇文章中我們知道了 setuptools 是什麼,以及它基本的功能和用法。在這篇文章中,我們會介紹如何講setuptools應用於稍大的項目中,通過 setuptools 控制包中的文件。

0x03 使用 find_packages()

在之前的例子中,我們使用的都是 setup() 的默認參數,使用默認參數只能打包一些簡單的、不復雜的工程,如果我們的工程中的文件越來越多,就不能使用它的默認參數了。

現在我們來建這樣一個工程:

.
├── 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 如下:

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

#-*- 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 包中的內容:

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

我們也可以排除掉某些文件:

find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])

0x04 使用 entry_points

entry_points 是一個字典,從entry point組名映射道一個表示entry point的字符串或字符串列表。Entry points是用來支持動態發現服務和插件的,也用來支持自動生成腳本。

比如說:

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




<div class="se-preview-section-delimiter"></div>

查看 /usr/local/bin/foo 內容:





<div class="se-preview-section-delimiter"></div>

#!/usr/bin/python




<div class="se-preview-section-delimiter"></div>

# 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 比較進階的使用方法,對於更詳細的其他用法,詳見官方文檔


本文的版權歸作者 羅遠航 所有,採用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用於商業用途;轉載請註明出處。感謝配合!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章