Python 分发工具初探之 setuptools 进阶
admin
2023-07-31 00:40:03
0

在上篇文章中我们知道了 setuptools 是什么,以及它基本的功能和用法。在这篇文章中,我们会介绍如何讲setuptools应用于稍大的项目中,通过 setuptools 控制包中的文件。

0x03 使用 find_packages()

在之前的例子中,我们使用的都是 setup() 的默认参数,使用默认参数只能打包一些简单的、不复杂的工程,如果我们的工程中的文件越来越多,就不能使用它的默认参数了。

现在我们来建这样一个工程:

12345678910111213141516 .├── setup.py└── src    ├── demo.egginfo       ├── PKGINFO       ├── 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:  demo10.1py2.7.egg  Length     Date   Time    Name                    1  032516 20:27   EGGINFO/dependency_links.txt      177  032516 20:27   EGGINFO/PKGINFO      141  032516 20:27   EGGINFO/SOURCES.txt        5  032516 20:27   EGGINFO/top_level.txt        1  032516 20:27   EGGINFO/zipsafe      102  032216 23:48   test/__init__.py      354  032516 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:  demo0.1py2.7.egg  Length     Date   Time    Name                    1  032516 20:47   EGGINFO/dependency_links.txt      176  032516 20:47   EGGINFO/PKGINFO      220  032516 20:47   EGGINFO/SOURCES.txt        5  032516 20:47   EGGINFO/top_level.txt        1  032516 20:47   EGGINFO/zipsafe      102  032216 23:48   test/__init__.py      354  032516 20:47   test/__init__.pyc        0  032516 17:24   test/a.txt        0  032516 17:24   test/data/data1.dat        0  032516 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是用来支持动态发现服务和插件的,也用来支持自动生成脚本。

比如说:

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!,和预期结果一样。

0x05 总结

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

 


相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...