Python 分发工具初探之 setuptools 进阶

举报
远航 | FIBOS 发表于 2020/12/02 22:38:27 2020/12/02
【摘要】 在上篇文章中我们知道了 setuptools 是什么,以及它基本的功能和用法。在这篇文章中,我们会介绍如何讲setuptools应用于稍大的项目中,通过 setuptools 控制包中的文件。 0x03 使用 find_packages() 在之前的例子中,我们使用的都是 setup() 的默认参数,使用默认参数只能打包一些简单的、不复杂的工程,如果我们的...

在上篇文章中我们知道了 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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

如果像之前那样使用 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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

依然是只有 __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'], } )
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这时我们再看一下 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
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

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

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

查看 /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')() )

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这个内容其实显示的意思是,foo将执行 console_scripts 中定义的foo所代表的函数。执行foo,发现打出了 hello world!,和预期结果一样。

0x05 总结

这篇文章介绍了一些 setuptools 比较进阶的使用方法,对于更详细的其他用法,详见官方文档


本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!

文章来源: blog.csdn.net,作者:冰水比水冰,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/luoyhang003/article/details/50984000

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。