Python 命令行之旅:深入 click 之參數篇

来源:https://www.cnblogs.com/djdjdj123/archive/2019/11/27/11945565.html
-Advertisement-
Play Games

一、前言 在概念上, click 把命令行分為 3 個組成:參數、選項和命令。 參數 就是跟在命令後的除選項外的內容,比如 git add a.txt 中的 a.txt 就是表示文件路徑的參數 選項 就是以 或 開頭的參數,比如 f、 file 命令 就是命令行的初衷了,比如 git 就是命令,而 ...


一、前言

在概念上, click 把命令行分為 3 個組成:參數、選項和命令。

  • 參數 就是跟在命令後的除選項外的內容,比如 git add a.txt 中的 a.txt 就是表示文件路徑的參數

  • 選項 就是以 - 或 -- 開頭的參數,比如 -f、--file

  • 命令 就是命令行的初衷了,比如 git 就是命令,而 git add 中的 add 則是 git 的子命令

二、參數

2.1 基本參數

基本參數 就是通過位置里指定參數值。

比如,我們可以指定兩個位置參數 x 和 y ,先添加的 x 位於第一個位置,後加入的 y 位於第二個位置。那麼在命令行中輸入 1 2的時候,分別對應到的就是 x 和 y:

@click.command()
@click.argument('x')
@click.argument('y')
def hello(x, y):
    print(x, y)

2.2 參數類型

參數類型 就是將參數值作為什麼類型去解析,預設情況下是字元串類型。我們可以通過 type 入參來指定參數類型。

click 支持的參數類型多種多樣:

  • str / click.STRING 表示字元串類型,這也是預設類型
  • int / click.INT 表示整型
  • float / click.FLOAT 表示浮點型
  • bool / click.BOOL 表示布爾型。很棒之處在於,它會識別表示真/假的字元。對於 1、yes、y 和 true 會轉化為 True;0、no、n 和 false 會轉化為 False
  • click.UUID 表示 UUID,會自動將參數轉換為 uuid.UUID 對象
  • click.FILE 表示文件,會自動將參數轉換為文件對象,併在命令行結束時自動關閉文件
  • click.PATH 表示路徑
  • click.Choice 表示選擇選項
  • click.IntRange 表示範圍選項

同 argparse 一樣,click 也支持自定義類型,需要編寫 click.ParamType 的子類,並重載 convert 方法。

2.2 參數類型

參數類型 就是將參數值作為什麼類型去解析,預設情況下是字元串類型。我們可以通過 type 入參來指定參數類型。

click 支持的參數類型多種多樣:

  • str / click.STRING 表示字元串類型,這也是預設類型
  • int / click.INT 表示整型
  • float / click.FLOAT 表示浮點型
  • bool / click.BOOL 表示布爾型。很棒之處在於,它會識別表示真/假的字元。對於 1、yes、y 和 true 會轉化為 True;0、no、n 和 false 會轉化為 False
  • click.UUID 表示 UUID,會自動將參數轉換為 uuid.UUID 對象
  • click.FILE 表示文件,會自動將參數轉換為文件對象,併在命令行結束時自動關閉文件
  • click.PATH 表示路徑
  • click.Choice 表示選擇選項
  • click.IntRange 表示範圍選項

同 argparse 一樣,click 也支持自定義類型,需要編寫 click.ParamType 的子類,並重載 convert 方法。

2.3 文件參數

在基本參數的基礎上,通過指定參數類型,我們就能構建出各類參數。

文件參數 是非常常用的一類參數,通過 type=click.File 指定,它能正確處理所有 Python 版本的 unicode 和 位元組,使得處理文件十分方便。

@click.command()
@click.argument('input', type=click.File('rb'))  # 指定文件為二進位讀
@click.argument('output', type=click.File('wb'))  # 指定文件為二進位寫
def inout(input, output):
    while True:
        chunk = input.read(1024)  # 此時 input 為文件對象,每次讀入 1024 位元組
        if not chunk:
            break
        output.write(chunk)  # 此時 output 為文件對象,寫入上步讀入的內容

2.4 文件路徑參數

文件路徑參數 用來處理文件路徑,可以對路徑做是否存在等檢查,通過 type=click.Path 指定。不論文件名是 unicode 還是位元組類型,獲取到的參數類型都是 unicode 類型。

@click.command()
@click.argument('filename', type=click.Path(exists=True))  # 要求給定路徑存在,否則報錯
def hello(filename):
    click.echo(click.format_filename(filename))

如果文件名是以 - 開頭,會被誤認為是命令行選項,這個時候需要在參數前加上 -- 和空格,比如

$ python hello.py -- -foo.txt
-foo.txt

2.5 選擇項參數

選擇項參數 用來限定參數內容,通過 type=click.Choice 指定。

比如,指定文件讀取方式限製為 read-only 和 read-write:

@click.command()
@click.argument('mode', type=click.Choice(['read-only', 'read-write']))
def hello(mode):
    click.echo(mode)

2.6 可變參數

可變參數 用來定義一個參數可以有多個值,且能通過 nargs 來定義值的個數,取得的參數的變數類型為元組。

若 nargs=N,N為一個數字,則要求該參數提供 N 個值。若 N 為 -1 則接受提供無數量限制的參數,如:

@click.command()
@click.argument('foo', nargs=-1)
@click.argument('bar', nargs=1)
def hello(foo, bar):
    pass

如果要實現 argparse 中要求參數數量為 1 個或多個的功能,則指定 nargs=-1 且 required=True 即可:

@click.command()
@click.argument('foo', nargs=-1, required=True)
def hello(foo, bar):
    pass

2.7 從環境變數讀取參數

通過在 click.argument 中指定 envvar,則可讀取指定名稱的環境變數作為參數值,比如:

@click.command()
@click.argument('filename', envvar='FILENAME')
def hello(filename):
    print(filename)

執行如下命令查看效果:

$ FILENAME=hello.txt python3 hello.py
hello.txt

而在 argparse 中,則需要自己從環境變數中讀取。

三、小節

本文講解了 click 中基本參數的用法,在此基礎上介紹了各種類型的參數,最後說明瞭從環境變數中獲取參數值的寫法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有點笨,參考了好幾篇大佬們寫的文章才整理出來的筆記.... 字面意思上解釋,線程池就是裝有線程的池,我們可以把要執行的多線程交給線程池來處理,和連接池的概念一樣,通過維護一定數量的線程池來達到多個線程的復用。 好處 多線程產生的問題 一般我們使用到多線程的編程的時候,需要通過 創建並開啟線程,我們可 ...
  • go gui 控制項和信號 控制項 控制項簡介 控制項是對數據和方法的封裝。控制項有自己的屬性和方法。屬性是指控制項的特征。方法是指控制項的一些簡單而可見的功能。如按鈕就是一個控制項,這個按鈕是方形的,裡面有張圖片,這是我們能看到外觀屬性,同時,這個按鈕具備被人按下的功能。 GTK中控制項主要分為兩類:容器控制項,非容 ...
  • struct interface 就可以實現面向對象中的繼承,封裝,多態 繼承的演示:Tsh類型繼承People類型,並且使用People類型的方法 多態的演示Tsh類型實現了介面Student,實現了介面定義的方法 完整代碼: ...
  • ```python import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',db='sg',charset='utf8') #先修路-conn car = conn.cursor() #備車-ca... ...
  • 場景 使用ElementUI的快速開始的項目模板搭建Element項目後, 要在vue頁面中使用jquery的語法。 這裡直接使用$.ajax會提示$找不到。 註: 博客:https://blog.csdn.net/badao_liumang_qizhi關註公眾號霸道的程式猿獲取編程相關電子書、教程 ...
  • 封裝一個資料庫模塊有三個功能:查詢,插入,關閉 1.查看 2.提交 3.關閉 ...
  • 前言 作為一個小白,在學習之前,我非常的明確,自己要學什麼編程語言。 怎麼判斷某門編程語言掉不掉發? 說起掉發,在前言中講過,程式員很多掉發原因都是因為選“錯”了編程語言,接下來讓我們看看編程語言各個撞死人(創始人)的發量是有多麼的恐怖! PHP之父:拉斯馬斯·勒德爾夫 拉斯馬斯·勒德爾夫,創建PH ...
  • 數據結構 數據結構(演算法)的介紹 數據結構的介紹 1) 數據結構是一門研究演算法的學科,只從有了編程語言也就有了數據結構.學好數據結構可以編寫 出更加漂亮,更加有效率的代碼。 2) 要學習好數據結構就要多多考慮如何將生活中遇到的問題,用程式去實現解決. 3) 程式 = 數據結構 + 演算法 20.2 數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...