Life, half is memory, half is to continue.

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

By Vincent. @2025.12.1 • 44
9个能大幅提升生产效率的Python工具

1)invoke — 任务执行和自动化(比 Python 的 Makefile 更好)

pip install invoke

✅ 为什么用它?


# 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 自动部署

🧠 什么项目最推荐用?

可以理解为:小团队/中型项目 “轻量 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)版本,但又不想编写 argparsefire 可以立即将其转换为 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()

🎯 这个时候提交代码时,就会自动:


✅ 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
扫码分享收藏
扫码分享收藏