使用python制作CLI基础_0
本文最后更新于:2025年2月5日 下午
主要学习使用python制作CLI两个主要方面的内容:
- 利用toml文件打包python项目 (本篇内容)
- python中的命令行参数解析
一、项目结构
mypackage
├── pyproject.toml
| # README.rst or README.md
| # LICENCE
└── mypackage
├── __init__.py
├── main.py (假设其中的main函数为入口函数,即为命令行使用时调用的函数)
└── ... (other Python files)
以上是大致的python项目结构,结构并非固定,包含基础文件即可
toml 文件为安装打包所需的配置文件
README 文件主要描述该工具的基本信息等,供使用者与后续开发者阅读
二、流程简述
- 创建一个python虚拟环境
- 编写py文件实现预期的逻辑功能
- 编写toml文件,记录依赖和入口函数等(后续介绍)
- 编写说明文档
- 运行
pip install -e .
将上
-e
不需要每次修改代码后重新安装,如果是确定最终版本也可以去掉,其全称为--editable
至此是本地安装为CLI的全部内容
以下是需要分发或上传的额外步骤
使用 pip 安装 build
pip install --upgrade build
运行
python -m build
运行该指令后将会生成一个
dist
文件夹并在其中生成tar.gz
和.whl
文件,可用于上传分发
整个流程适用于所有符合 PEP 517 和 PEP 660 标准的构建后端,无论你toml文件中指定是 setuptools 还是 hatch 只要配置正确均可执行
三、编写toml文件
# 项目元数据
[project]
name = "my_project" # 项目名称
version = "0.1.0" # 项目版本
description = "A simple Python project" # 项目描述
authors = [
{ name = "Your Name", email = "your.email@example.com" }, # 作者信息
]
license = { file = "LICENSE" } # 许可证文件
readme = "README.md" # 项目说明文件
requires-python = ">=3.8" # 支持的 Python 版本
classifiers = [ # PyPI 分类标签
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
]
# 项目依赖
dependencies = [ # 项目运行时依赖
"requests>=2.25.0",
"numpy>=1.20.0",
]
# 可选依赖(额外功能)
[project.optional-dependencies]
dev = [ # 开发环境依赖
"pytest>=6.0.0",
"black>=21.0",
]
docs = [ # 文档生成依赖
"sphinx>=4.0.0",
"sphinx-rtd-theme>=0.5.0",
]
# 项目脚本(命令行工具)
[project.scripts]
my-cli = "mypackage.main:main" # 命令行工具入口点
# 构建系统配置
[build-system]
requires = ["setuptools>=61.0", "wheel"] # 构建依赖
build-backend = "setuptools.build_meta" # 构建后端
以上是一个toml文件的 基础 结构,当然还有许多其他的标签并未提及,例如你也可以在其中利用[tool.pytest.ini_options]
配置 pytest
的相关信息
不同的构建后端还可以支持更加丰富的内容,例如 hatch 可以使用 hatch new “myproject”
命令初始化项目结构并自动生成toml文件部分内容
最后获得的 tar.gz 与 .whl 文件可以使用 pip install **.tar.gz/**.whl
安装也可以用 twine 上传至 pypi