您的位置:首页 > 编程语言 > Python开发

Python 分发工具初探之 setuptools 进阶

2016-03-25 21:12 477 查看
在上篇文章中我们知道了 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。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: