天天看點

Python程式設計:使用sys、argparse、click、fire實作指令行參數解析

python

實作腳本指令行的庫有:

  1. 内置庫sys
  2. 内置庫argparse
  3. 第三方庫click
  4. 第三方庫fire

sys.argv 包含指令行參數清單,第一個參數是檔案名

sys_demo.py

import sys


def add(a, b):
    return a + b

if __name__ == '__main__':
    ret = add(sys.argv[1], sys.argv[2])
    print(ret)      

運作結果

(py3) $ python sys_demo.py 1 2
12
      

python自帶的參數解析,思路還算清晰,就是代碼較多

argparse_demo.py

import argparse


def add(a, b):
    return a + b


if __name__ == '__main__':
    # 初始化解析器
    parser = argparse.ArgumentParser()

    # 定義參數
    parser.add_argument("-a", "--a", help="參數a")
    parser.add_argument("-b", "--b", help="參數b")

    # 解析
    args = parser.parse_args()
    ret = add(args.a, args.b)
    print(ret)
      
(py3) $ python argparse_demo.py -a 1 -b 2
12      

click庫

click庫使用裝飾器,不過已經對源代碼進行了修改

click_demo.py

import click


@click.command()
@click.option("-a", "--a", help="參數a")
@click.option("-b", "--b", help="參數b")
def add(a, b):
    click.echo(a + b)


if __name__ == '__main__':
    ret = add()
    print(ret)
      
(py3) $ python click_demo.py -a 1 -b 2
12
      

fire庫

說實話,fire庫太優秀了,簡潔,而且Fire可以

  • 不接收參數
  • 接收函數名
  • 接收字典
  • 接收對象
import fire


def add(a, b):
    return a + b


if __name__ == '__main__':
    fire.Fire()      
(py3) $ python fire_demo.py add 1 2
3
      

比較發現,唯獨fire将我輸入的數字型字元串轉為了數字,進行相加,輸出3,其他三個庫均預設為字元串,輸出12

參考 一個“牛逼”的 Python 指令行解析庫 The Python Fire Guide