在上篇文章中我们知道了 setuptools 是什么,以及它基本的功能和用法。在这篇文章中,我们会介绍如何讲setuptools应用于稍大的项目中,通过 setuptools 控制包中的文件。
在之前的例子中,我们使用的都是 setup() 的默认参数,使用默认参数只能打包一些简单的、不复杂的工程,如果我们的工程中的文件越来越多,就不能使用它的默认参数了。
现在我们来建这样一个工程:
| 12345678910111213141516 | .├── 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 如下:
| 123456789101112 | 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 :
| 12345678910111213141516171819 | #-*- 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 包中的内容:
| 123456789101112131415 | 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\”]) |
entry_points 是一个字典,从entry point组名映射道一个表示entry point的字符串或字符串列表。Entry points是用来支持动态发现服务和插件的,也用来支持自动生成脚本。
比如说:
| 1234567891011121314151617 | setup( entry_points = { \’console_scripts\’: [ \’foo = demo:test\’, \’bar = demo:test\’, ], \’gui_scripts\’: [ \’baz = demo:test\’, ] }) 我们再安装这个 egg,会发现在安装过程中会出现: ```bashInstalling foo script to /usr/local/binInstalling bar script to /usr/local/bin |
查看 /usr/local/bin/foo 内容:
| 12345678910 | #!/usr/bin/python# EASY-INSTALL-ENTRY-SCRIPT: \’demo==0.1\’,\’console_scripts\’,\’foo\’__requires__ = \’demo==0.1\’import sysfrom 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!,和预期结果一样。
这篇文章介绍了一些 setuptools 比较进阶的使用方法,对于更详细的其他用法,详见官方文档