1. 程式人生 > >Python程式設計:使用sys、argparse、click、fire實現命令列解析

Python程式設計:使用sys、argparse、click、fire實現命令列解析

python實現指令碼命令列的庫有:

  1. 內建庫sys
  2. 內建庫argparse
  3. 第三方庫click
  4. 第三方庫fire

內建庫sys

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

內建庫argparse

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