1. 程式人生 > 實用技巧 >Click 命令列神器

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