0%

Python库打包备忘录

Python 库打包的格式包括 WheelEgg。Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。setuptools使用也是非常简单,假设项目目录如下:

1
2
3
4
5
6
7
8
9
10
11
scr
|- pyflow
|- __init__.py
|- util
|- logger.py
|- model.py
|- xx.pyd
|- api
|- ctp_future
|- xx.dll
|- xx.dll

scr 是项目根目录,pyflow 是包的根目录

使用 setuptools,创建一个 setup.py 打包配置文件,放在项目根目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from setuptools import setup, find_packages
from src.pyflow import __version__

with open('README.md', encoding="utf8") as fp:
LONG_DESCRIPTION = fp.read()

# Metadata goes in setup.cfg. These are here for GitHub's dependency graph.
# 也可有参调用,则会覆盖.cfg的对应条目
setup(
name="pyflow",
version=__version__,
long_description=LONG_DESCRIPTION,
long_description_content_type='text/markdown',
packages=find_packages("src"),
package_dir={"": "src"},
include_package_data=True,
package_data={'': ['model/*.pyd', 'api/ctp_future/*.*', 'api/ctp_spot/*.*']}
)

注意使用package_data命令将*.py之外的文件同时打包。

1
package_data={'': ['model/*.pyd', 'api/ctp_future/*.*', 'api/ctp_spot/*.*']}

设置完成之后就可以进行打包了

1
2
3
4
5
6
7
8
9
# 打包成 tar 包
python setup.py sdist

# 安装 wheel 库后可以打包成 whl 包
pip install wheel
python setup.py bdist_wheel

# 打包完后的包可以直接通过 pip 安装
pip install <path-to-package>

setuptools通常使用setup.cfg 文件来进行具体的设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[metadata]
;name:包名称
;version:包版本
;url:主页地址
;project_urls:包相关网页地址,字典格式,对应关系见下图
;author:作者名字
;author_email:作者邮箱
;maintainer:维护者名字
;maintainer_email:维护者邮箱
;classifiers:分类信息
;license:使用的开源许可
;description:简短描述
;long_description:详细描述
;long_description_content_type:详细描述的格式
;keywords:关键词
;platforms:支持的操作系统
;long_description = file: README.md
;long_description_content_type = text/markdown
; PyPI的分类,类似于标签,所有条目见 https://pypi.org/pypi?%3Aaction=list_classifiers

name = pyflow
;version = 0.0.1
author = 稻草人
author_email = dybeta2021@163.com
maintainer = 稻草人
maintainer_email = dybeta2021@163.com
url = https://dybeta2021.github.io/
license = BSD-3-Clause
description = flow-lib, a simple platform
classifiers =
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Topic :: Software Development :: User Interfaces
Environment :: Win32 (MS Windows)
Operating System :: Microsoft :: Windows :: Windows 10
Programming Language :: Python :: 3.8

[options]
;依赖信息
;install_requires:依赖的其他库列表,安装该库之前也会安装
;extras_require:其他的可选依赖库,安装该库不会自动安装
;setup_requires:构建依赖的库,不会安装到解释器库,安装到本地临时目录
;python_requires:Python 版本依赖
;use_2to3:布尔值,True 则自动将 Python2 的代码转换为 Python3
;packages = find: # 自动搜索存在__init__.py的文件夹作为包

python_requires = ==3.8.*
;依赖install_requires,pip安装时靠的就是这个而不是requirements.txt
install_requires =
plotly==4.14.3
zip_safe = False

;功能管理
;packages:该库包含的 Python
;package_dir:字典配置包的目录
;package_data:配置包的其他数据文件
;include_package_data:布尔值,为 True 则根据 MANIFEST.in 文件自动引入数据文件
;exclude_package_data:字典配置需要移除的数据文件
;zip_safe:布尔值,表明这个库能否安全的使用 zip 安装和执行
;entry_points:库的入口点配置,可用来做命令行工具和插件

setup 函数常用的参数如下:

name 包名称
version 包版本
author 程序的作者
author_email 程序的作者的邮箱地址
maintainer 维护者
maintainer_email 维护者的邮箱地址
url 程序的官网地址
license 程序的授权信息
description 程序的简单描述
long_description 程序的详细描述
platforms 程序适用的软件平台列表
classifiers 程序的所属分类列表
keywords 程序的关键字列表
packages 需要处理的包目录(通常为包含 __init__.py 的文件夹)
py_modules 需要打包的 Python 单文件列表
download_url 程序的下载地址
cmdclass 添加自定义命令
package_data 指定包内需要包含的数据文件
include_package_data 自动包含包内所有受版本控制(cvs/svn/git)的数据文件
exclude_package_data 当 include_package_data 为 True 时该选项用于排除部分文件
data_files 打包时需要打包的数据文件,如图片,配置文件等
ext_modules 指定扩展模块
scripts 指定可执行脚本,安装时脚本会被安装到系统 PATH 路径下
package_dir 指定哪些目录下的文件被映射到哪个源码包
requires 指定依赖的其他包
provides 指定可以为哪些模块提供依赖
install_requires 安装时需要安装的依赖包
entry_points 动态发现服务和插件,下面详细讲
setup_requires 指定运行 setup.py 文件本身所依赖的包
dependency_links 指定依赖包的下载地址
extras_require 当前包的高级/额外特性需要依赖的分发包
zip_safe 不压缩包,而是以目录的形式安装