Python 命令行工具怎么写提示词(argparse / Typer:子命令、参数校验、帮助信息、退出码与测试)

想把常用的 Python 脚本做成好用的命令行工具(团队内部工具、数据处理工具)时用:描述命令和参数,得到带子命令、参数校验、清晰帮助信息、有意义退出码和进度输出的 CLI 代码,以及安装方式和测试。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
你是一名注重使用体验的 Python 工程师。请帮我把下面的功能做成命令行工具。

- 工具名称:[如 datatool]
- 功能与子命令:[功能与子命令](例:import 导入 CSV、export 导出报表、check 校验数据)
- 每个子命令的参数和选项:[参数说明]
- 使用库:[使用库](可选:标准库 argparse/Typer/Click/你推荐)
- 使用者:[如团队内的非开发同事、CI 流水线]

要求:
1. 选择库:如果我写了「你推荐」,根据是否允许第三方依赖、功能复杂度给出建议。
2. 命令设计:
   - 子命令和参数名清晰一致,长选项用连字符命名,常用选项提供短选项;
   - 必填与可选的区分、默认值、取值范围和文件路径的校验;
   - 危险操作(覆盖、删除)需要确认,或者提供跳过确认的选项供脚本使用;
   - 提供预演选项和详细输出选项。
3. 帮助信息:每个命令和参数都有中文说明,并附上使用示例。
4. 输出:正常结果输出到标准输出,日志和错误输出到标准错误,方便在管道中使用;支持机器可读的输出格式(如 JSON)供脚本调用。
5. 退出码:成功为 0,参数错误、数据校验失败、运行出错分别使用不同的非零退出码,并写在帮助信息中。
6. 错误提示:面向使用者的友好提示,不直接抛出完整堆栈(详细模式下再显示)。
7. 长时间任务显示进度;被中断时(Ctrl+C)友好退出并清理临时文件。
8. 打包:在项目配置中声明命令入口,安装后可以直接用工具名调用。
9. 测试:针对参数解析和主要命令写测试,使用对应库提供的测试工具。

输出:项目结构、完整代码(中文注释)、项目配置中的入口声明、安装与使用示例、测试代码。

高亮处换成你自己的内容:[如 datatool]、[功能与子命令]、[参数说明]、[使用库]、[如团队内的非开发同事、CI 流水线]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[使用者] 会影响设计重点:给非开发同事用的工具,提示信息和确认步骤要更友好;给 CI 流水线用的,要有机器可读输出、跳过确认的选项和稳定的退出码。[使用库] 不想引入依赖就选标准库 argparse,子命令多、希望少写代码可以选 Typer。

常见坑:

  • 把进度和日志打印到标准输出,结果别人把输出通过管道传给其他命令时,数据和日志混在一起。数据走标准输出,其他信息走标准错误。
  • 所有错误都以退出码 1 结束,调用的脚本无法区分「参数写错了」和「数据有问题」。
  • 只能用「python 某路径下的脚本」这种方式运行。在项目配置里声明入口,安装后就能直接输入工具名使用。

追问技巧:追问「给这个工具加上命令行自动补全,并说明在 bash、zsh、PowerShell 中怎么启用」,或「增加一个配置文件,命令行参数优先于配置文件」。

示例输出

示例,仅供参考(Typer,节选)
python
from pathlib import Path
import typer

app = typer.Typer(help="数据导入导出工具")

EXIT_INVALID_DATA = 3

@app.command("import")
def import_csv(
    file: Path = typer.Argument(..., exists=True, readable=True, help="要导入的 CSV 文件"),
    dry_run: bool = typer.Option(False, "--dry-run", "-n", help="只校验不写入"),
) -> None:
    """导入 CSV 数据。示例:datatool import orders.csv --dry-run"""
    errors = validate(file)
    if errors:
        for e in errors:
            typer.echo(f"第 {e.line} 行:{e.message}", err=True)
        raise typer.Exit(code=EXIT_INVALID_DATA)
    if not dry_run:
        write_rows(file)
    typer.echo(f"处理完成:{file.name}")
toml
[project.scripts]
datatool = "datatool.cli:app"

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~