9个能大幅提升生产效率的Python工具

索引目录
1)invoke — 任务执行和自动化(比 Python 的 Makefile 更好)
✅ 为什么用它?
🎯 适用场景
🧠 什么项目最推荐用?
📦 示例:数据分析脚本自动化
2)rich-click — 美观、彩色的命令行界面,无需重写帮助文本
3)Prefect——面向非数据科学家的工作流编排
4)loguru — 无需样板代码且内置轮换功能的日志记录工具
5)httpx.AsyncClient + anyio — 支持同步/异步切换的异步 HTTP 客户端
6)fastapi + uvicorn — 立即将您的脚本公开为 REST API
7)fire — 根据现有函数自动生成 CLI
8)rich.traceback — 更好的回溯信息,更快地调试
9)black + isort + pre-commit — “设置后即可忘记”的格式化方式,可减少代码审查的摩擦
✅ 目录结构
✅ pyproject.toml(统一 black & isort 配置)
✅ .pre-commit-config.yaml
✅ 示例源代码:src/app.py(格式混乱)
✅ 运行 pre-commit
✅ 自动修复效果
✅ Git 工作流
🧠 提示:团队最佳实践
🎁 Bonus: 自动运行 pytest & static check
📎 总结
1)invoke — 任务执行和自动化(比 Python 的 Makefile 更好)
pip install invoke
✅ 为什么用它?
- 用 Python 写任务脚本,比 shell + Makefile 更优雅
- 支持函数、模块、条件判断、异常处理
- 不用记复杂 shell 语法,逻辑清晰
- 自动命令行接口(CLI)— 像写函数一样写命令,无需 argparse/Click,写
@task自动变 CLI 命令。 - 命令组合 & 任务依赖更清晰:可以通过 Python 处理任务依赖、封装逻辑,比 Makefile 直观。
- 对 Python 工程师更友好
- 单一语言编排任务 = 开发体验更好
- 团队成员不用 shell 黑魔法
- Windows / Linux / macOS 一致性高
# tasks.py
from invoke import task
@task
def clean(c):
"""Windows Clean up temporary files."""
c.run("rmdir /S /Q temp_files "
"|| echo No temporary files to remove.")
@task(pre=[clean])
def build(c):
"""Build the project."""
c.run("echo Building the project...")
$ inv build
🎯 适用场景
| 场景 | invoke 优点 |
|---|---|
| 项目构建/打包 | 可替代 Makefile,跨平台,一致性好 |
| 自动化开发流程 | lint → test → build → deploy pipeline 本地脚本 |
| 数据处理管道 | 任务顺序执行,日志、异常控制清晰 |
| 本地环境管理 | 启动 dev 服务、Docker、数据库 mock |
| CI/CD 辅助 | 在 CI 中统一脚本入口 |
| 部署脚本 | 结合 Fabric SSH 自动部署 |
🧠 什么项目最推荐用?
- 后端/数据工程项目
- 多命令脚本较多的项目
- 需要统一开发环境命令的团队
- 数据 pipeline 本地调试
- Python 工程而非纯容器 Orchestration
可以理解为:小团队/中型项目 “轻量 DevOps” 必备工具
📦 示例:数据分析脚本自动化
# tasks.py
from invoke import task
@task
def ingest(c):
c.run("python scripts/ingest.py")
@task
def clean(c):
c.run("python scripts/clean.py")
@task(pre=[ingest, clean])
def train(c):
c.run("python ml/train.py")
# CLI:
# > inv train
Pro Tip:当你的项目有多个不同功能的脚本(测试、代码检查、部署)且你不想编写几十个临时 shell 脚本时,可以使用它。
2)rich-click — 美观、彩色的命令行界面,无需重写帮助文本
pip install click rich rich-click
为什么用它?:只需要做最小的更改,即可为点击命令添加颜色、格式和实时加载指示器。
import click
import rich_click as rc
from rich.console import Console
from rich.table import Table
console = Console()
# 使用 rich_click 美化帮助
rc.SYSTEM_HELPTEXT = 'bold cyan'
rc.SYSTEM_OPTION = 'bold green'
rc.STYLE_COMMAND = 'bold yellow'
rc.GLOBAL_HELP_HEADER = '✨ Awesome CLI工具 ✨'
rc.GLOBAL_HELP_FOOTER = '感谢使用!🚀'
@click.group(help='一个使用 rich_click 打造的漂亮 CLI 工具')
def cli():
pass
@cli.command(help='打印问候语')
@click.option('--name', '-n',
default='朋友', help='你的名字')
def hello(name):
console.print(f'👋 你好, [bold magenta]{name}[/]!')
@cli.command(help='显示数据表格')
def show():
table = Table(title='用户列表')
table.add_column('ID',
justify='right',
style='cyan',
no_wrap=True)
table.add_column('Name',
style='magenta')
table.add_column('Role',
justify='center',
style='green')
table.add_row('1', 'Jack Zhang', 'Admin')
table.add_row('2', 'Bob', 'User')
table.add_row('3', 'Charlie', 'Guest')
console.print(table)
@cli.command(help='模拟任务进度')
def progress():
from rich.progress import Progress
import time
with Progress() as prog:
task = prog.add_task("[cyan]处理任务...",
total=100)
for _ in range(100):
prog.update(task, advance=1)
time.sleep(0.05)
if __name__ == '__main__':
cli()

这下黑白命令行界面是不是以下就变得生动起来啦!从平平无奇的村妇变成“浓妆淡抹总相宜的美娇娘”😄😏
3)Prefect——面向非数据科学家的工作流编排
pip install prefect
使用
pip命令安装这个库,需要安装很多依赖包,还需要事先安装 Microsoft Visual C++ 14.0 及以上版本的生成工具(非常大,边下载边安装特耗时),否则会安装失败。
为什么用它?:无需庞大的基础设施即可构建流程、任务、重试逻辑和调度。适用于需要编排的脚本。
from prefect import flow, task
@task
def fetch_data():
return [1,2,3]
@task
def process(data):
return [x*2 for x in data]
@flow
def my_flow():
data = fetch_data()
result = process(data)
print(result)
if __name__ == '__main__':
my_flow()
如果你的自动化脚本包含多个阶段,并且需要可见性、重试和任务分解(而不仅仅是一次性脚本)时,可以考虑使用这个工具。
4)loguru — 无需样板代码且内置轮换功能的日志记录工具
pip install loguru
为什么用它?:无需设置 logging.getLogger() ,即可获得一个带有颜色、文件轮换和上下文信息的单行日志工具。
from loguru import logger
def divide(a, b):
try:
result = a / b
logger.info(f"Division successful: {a} / {b} = {result}")
return result
except ZeroDivisionError as e:
logger.error(f"Error: Division by zero attempted with a={a}, b={b}")
return None
if __name__ == "__main__":
divide(10, 2)
divide(10, 0)

设置简单,开箱即用,配置更便捷——提高生产力。
5)httpx.AsyncClient + anyio — 支持同步/异步切换的异步 HTTP 客户端
pip install anyio httpx
为什么用它?:当你构建需要与多个 API 通信的自动化流程时, requests 会阻塞; httpx + anyio 可以提供异步功能,而无需重写所有代码。
import anyio
import httpx
async def fetch(client, url, send_channel):
try:
resp = await client.get(url)
await send_channel.send((url, resp.status_code, resp.text[:100]))
except Exception as e:
await send_channel.send((url, None, str(e)))
async def main():
urls = [
'https://api.github.com/users/octocat',
'https://www.python.org',
'https://www.google.com',
]
timeout = httpx.Timeout(10.0)
async with httpx.AsyncClient(timeout=timeout) as client:
send, recv = anyio.create_memory_object_stream(max_buffer_size=10)
async with send:
async with anyio.create_task_group() as tg:
for url in urls:
tg.start_soon(fetch, client, url, send)
# 接收结果
async with recv:
async for url, status, body in recv:
print(f'✅ {url}')
print(f'Status: {status}')
print(f'Preview: {body}\n')
if __name__ == '__main__':
anyio.run(main)
6)fastapi + uvicorn — 立即将您的脚本公开为 REST API
pip install fastapi uvicorn
如果你需要自动文档(推荐):
pip install "fastapi[all]"
为什么用它?:在 30 分钟内将一次性脚本转换为服务。适用于需要端点的内部工具。
# fastapi_demo.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {'message': 'Hello, FastAPI!'}
# CLI: uvicorn fastapi_demo:app --reload

无需编写样板代码——只需公开功能即可。下一步:添加文档、进行身份验证,就完成了。
7)fire — 根据现有函数自动生成 CLI
pip install fire
为什么用它?:现在你有一个函数,想要一个命令行界面(CLI)版本,但又不想编写 argparse。fire 可以立即将其转换为 CLI 版本。
import fire
def greet(name, times=1):
for _ in range(times):
print(f"Hi, {name}!")
if __name__ == '__main__':
fire.Fire(greet)
current_directory> python temp.py JackZhang --times 3
Hi, JackZhang!
Hi, JackZhang!
Hi, JackZhang!
8)rich.traceback — 更好的回溯信息,更快地调试
为什么用它?:默认的回溯信息很混乱。rich 的回溯信息会提供颜色标注、局部变量和上下文,让你节省大量查找问题的时间。
from rich.traceback import install
install(show_locals=True)
def divide(a, b):
return a / b
divide(10, 0)

立即获得清晰答案——尤其是在自动化生产环境出现故障,需要快速找到答案的时候。
9)black + isort + pre-commit — “设置后即可忘记”的格式化方式,可减少代码审查的摩擦
为什么用它?:与其争论格式问题,不如将其自动化。虽然很多人都知道这一点,但真正能一次性配置好并终身无需再管的人却不多见。
示例:
✅ 目录结构
my_project/
├── pyproject.toml
├── .pre-commit-config.yaml
└── src/
└── app.py
✅ pyproject.toml(统一 black & isort 配置)
推荐统一在 pyproject.toml 管理工具链
[tool.black]
line-length = 88
target-version = ["py310"]
skip-string-normalization = false
[tool.isort]
profile = "black"
line_length = 88
multi_line_output = 3
include_trailing_comma = true
✅ .pre-commit-config.yaml
让提交时代码自动格式化 & import 排序
repos:
# Black formatter
- repo: https://github.com/psf/black
rev: 24.3.0 # 查 GitHub 最新 tag
hooks:
- id: black
# isort imports sorter
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
# Optional: flake8 for linting
- repo: https://github.com/pycqa/flake8
rev: 6.1.0
hooks:
- id: flake8
✅ 示例源代码:src/app.py(格式混乱)
import sys,os
import requests
from datetime import datetime
def hello():
print( "hello world" )
print(os.getcwd())
print(datetime.utcnow(), sys.version)
hello()
✅ 运行 pre-commit
安装:
pip install pre-commit
pre-commit install
手动触发一次(第一次必须):
pre-commit run --all-files
✅ 自动修复效果
格式化后变成:
import os
import sys
from datetime import datetime
import requests
def hello():
print("hello world")
print(os.getcwd())
print(datetime.utcnow(), sys.version)
hello()
🎯 这个时候提交代码时,就会自动:
- black 格式化
- isort 排序 import
- flake8 检查错误(可选)
✅ Git 工作流
平时你啥都不用想:
git add .
git commit -m "feat: add hello app"
⚙ pre-commit 会自动修复 → 防止 code review 时争论格式
🚫 不再出现 “import 顺序不对 / 格式不统一 / 有多余空格”
🧠 提示:团队最佳实践
| 工具 | 作用 |
|---|---|
| black | 统一 Python 代码风格 |
| isort | 自动排序 imports |
| pre-commit | 挂钩 Git 阶段自动检查 |
| pyproject.toml | 黑科技:统一 Python 工具配置标准化 |
🎁 Bonus: 自动运行 pytest & static check
可以在 pre-commit-config.yaml 中添加:
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.7.1
hooks:
- id: mypy
- repo: local
hooks:
- id: pytest
name: pytest
entry: pytest
language: system
types: [python]
📎 总结
| 目标 | 方案 |
|---|---|
| 自动格式化 | black |
| 自动 import 排序 | isort |
| Git 自动校验 | pre-commit |
| 一次配置,永不操心 | ✅ Set & Forget |

