Python 代码组织
清空你的杯子,方能再行注满,空无以求全.(李小龙)
准备
为方便管理, 最好不将Python的包放在同一个地方.此时可创建
虚拟环境隔离其它包.
# 创建虚拟环境
mkdir $HOME/tmp/venv
cd $HOME/tmp
python3 -m venv venv
source venv/bin/activate
deactivate # 退出虚拟环境
rm -rf $HOME/tmp/venv # 不需要可删除此目录
# 删除虚拟环境中已安装的包
# 回到虚拟环境刚创建时的状态
python3 -m venv --clear venv
目录结构
package_name/
├── LICENSE
├── MANIFEST.in
├── README.md
├── pyproject.toml
├── src
│ └── package_name
│ └──__init__.py
└── tests
├── test_view.py
└── test_model.py
Entry | Description |
---|---|
package_name | 包名 |
LICENSE | 软件许可协议, e.g. MIT, GPL, Apache… |
README.md | 包的介绍 |
pyproject.toml | 包的元信息(对此包之描述), 可类比文件的数据和文件的元信息 |
src | 包的源码 |
tests | 对src 中代码的测试 |
__init__.py | 用来说明当前目录是一个包, 内容可以空 |
MANIFEST.in | 包的配置文件, 可用来包含非python文件 |
pyproject.toml
此文件有两个作用:
- 让构建工具知道此包之信息, 方便构建过程的进行
- 让LS(Language Server)知道你写的代码是在一个包中而非单个代码文件,
通过LSP(Language Server Protocol)可实现定义跳转、代码补全等功能.
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "<packagename>"
version = "0.0.1"
authors = [
{ name="author", email="hello@world.com" },
]
description = "Description of this package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
dependencies = [
"matplotlib==3.7.2",
"numpy==1.25.2",
]
[project.urls]
"Homepage" = "https://github.com/author/packagename"
"Bug Tracker" = "https://github.com/author/packagename/issu
es"
[project.scripts]
packagename = "packagename:main"
[build-system]
: 源码到源码包的构建工具,这里用的是setuptools
.[project]
: 包的信息name
: 包名version
: 包的版本authors
: 作者的信息description
: 包的描述readme
:README.md
文件requires-python
: 要求的Python版本dependencies
: 此包之依赖
[project.urls]
: 包的链接.[project.scripts]
: 包的入口, 相当于C lang中的main函数,
构建工具会在$PYTHON_HOME/bin
中包装此入口, 即可以在CLI中
直接使用packagename
这一命令.
MANIFEST.in
recursive-include src/packagename/ *.ttf *.css
# 包含src/packagename下所有的.ttf和.css文件
代码的运行、调试
# 对src中的文件
cd packagename/src/
python3 -m packagename.main # packagename/src/packagename/main.py
代码的构建
# 进入pyproject.toml所在目录
pip3 install build
python3 -m build
# 此命令会生成dist目录
# 生成的源码包就放在此目录
源码包安装
pip3 install dist/*.tar.gz