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 條評論

登入 後參與評論

還沒有評論,來搶沙發~