Click 命令列神器
Click 命令列神器
在Python開發和測試過程中主要有兩種模式可以選擇:指令碼模式、命令列模式。在程式碼的開發和除錯過程中使用指令碼模式還是很方便的,尤其接觸pycharm、eclipse這類強大的IDE,或者配合vs code這種綜合的文字編輯器。但是如果使用純文字編輯器,或者是在做整個系統開發時,與其他模型進行介面呼叫時,命令列模式就顯得非常重要了。目前有很多熱門的命令列工具,本文會一一介紹一下,並且重點介紹一下最近發現的一款命令列神器Click。
命令列模式在Python開發中並不陌生,簡單的說就是*python hello.py*這種使用命令的模式執行Python程式。目前比較主流的命令列工具主要有以下幾項,
- 內建的sys
- argparse
- tensorflow的Flags
當然,還有其他的,例如,Fire、Docopt,工具有很多,本文不在這裡一一展開,概括性的講解一下上述三款命令列工具,詳細的闡述一下本文的重點Click,因為,相對而言這款工具實在太方便、太強大了。
sys
sys和os一樣,是Python自帶且非常常用的模組,該模組主要作用就是獲取和Python直譯器相關的一些資訊,它的一個常見用途就是獲取命令列引數,
import sys def hello_world(): print(sys.argv[1], sys.argv[2]) hello_world() # 輸出 $ python test.py 1 2 >>> 1 2
sys通過argv來獲取命令列引數,其中argv[0]獲取的是指令碼的名稱,從argv[1]開始獲取的是命令列傳入的引數。
argparse
argparse是用的非常多的一種命令列工具,它支援選項命名,指定資料型別,新增幫助資訊,設定預設引數,功能非常全面而強大,因此非常受歡迎
import argparse arg = argparse.ArgumentParser("This is a test!") def main(arg): print(arg.name) print(arg.age) if __name__ == '__main__': arg.add_argument("--name", "-n", default="China", type=str, help="the name of your country.") arg.add_argument("--age", "-a", default=25, type=int, help="your age.") args = arg.parse_args() main(args)
幫助
# 輸出
$ python test.py --help
usage: This is a test! [-h] [--name NAME] [--age AGE]
optional arguments:
-h, --help show this help message and exit
--name NAME, -n NAME the name of your country.
--age AGE, -a AGE your age.
可以輸入對應的引數
$ python test.py --name Chinese --age 26
Chinese
26
也可以使用簡寫在命令列傳入引數
$ python test.py -n Chinese -a 26
Chinese
26
FLAGS
做深度學習相關方向,尤其經常使用tensorflow的應該對這個命令列工具比較熟悉,FLAGS是tensorflow提供的一款命令列工具,和大多數命令列工具大同小異
import tensorflow as tf
FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string("train_path", '/voc2012/JPEG', "training file path")
tf.flags.DEFINE_integer("batch_size", 64, "training batch size")
tf.flags.DEFINE_float("lr", 0.01, "learning rate")
def main(_):
print(FLAGS.train_path)
print(FLAGS.batch_size)
print(FLAGS.lr)
if __name__ == '__main__':
tf.app.run()
檢視幫助
$ python test.py --help
# 輸出
USAGE: test.py [flags]
flags:
test.py:
--batch_size: training batch size
(default: '64')
(an integer)
--lr: learning rate
(default: '0.01')
(a number)
--train_path: training file path
(default: '/voc2012/JPEG')
Try --helpfull to get a list of all flags.
命令列傳入引數
$ python test.py --train_path /home/li/images --batch_size 128 --lr 0.001
# 輸出
/home/li/images
128
0.001
Click
下面要介紹的就是本文的主角Click,這款工具是用flask的開發團隊pallets進行開發,目前在github已經7.6k+star,受歡迎程度可見一斑
Click的開發初衷就是使用最少的程式碼,以一種可組合的方式建立漂亮的命令列介面。它的目的是使編寫命令列工具的過程快速而有趣,同時防止由於無法實現預期的CLI API而導致的任何問題。
Click主要有以下3個亮點:
- 命令的任意巢狀
- 自動幫助頁面生成
- 支援在執行時延遲載入子命令
安裝
pip install click
import click
@click.command()
@click.option("--name", default="li", help="your name")
@click.option("--age", default=26, help="your age")
def hello_world(name, age):
click.echo(name)
print(age)
hello_world()
命令列呼叫
$ python test.py --name ll --age 27
# 輸出
ll
27
可以看出,上述主要用了click的3個方法,分別是,
- command
- option
- echo
這3個方法在Click工具中至關重要,除此之外還有其他的方法,它們的功能分別是,
方法功能
- command:用於裝飾一個函式,使得該函式作為命令列的介面,例如上述裝飾hello_world
- option:用於裝飾一個函式,主要功能是為命令列新增選項
- echo:用於輸出結果,由於print函式在2.x和3.x之間存在不同之處,為了更好的相容性,因此提供了echo輸出方法
- Choice:輸入為一個列表,列表中為選項可選擇的值
把上述程式的幫助資訊輸出
$ python test.py --help
Usage: test.py [OPTIONS]
Options:
--name TEXT your name
--age INTEGER your age
--help Show this message and exit.
在示例程式中,對於option只使用了default、help兩個屬性,除此之外option還有其他的屬性選項,它們的功能如下
屬性描述
- default:給命令列選項新增預設值
- help:給命令列選項新增幫助資訊
- type:指定引數的資料型別,例如int、str、float
- required:是否為必填選項,True為必填,False為非必填
- prompt:在命令列提示使用者輸入對應選項的資訊
- nargs:指定命令列選項接收引數的個數,如果超過則會報錯
除此之外,Click還提供了group方法,該方法可以新增多個子命令
呼叫子命令second
$ python test.py second --name hh
# 輸出
hello world
this is second: hh