1. 程式人生 > >python常用的命令列解析庫

python常用的命令列解析庫

1、argparse

argparse是python自帶的模組,要經歷解析器初始化、引數定義、解析一套流程,使用起來有些繁瑣。

argpase的使用:

class Calculator(object):
    """
    計算器
    """

    def add(self, x, y):
        """
        加法運算
        Args:
            x: 第一個運算元
            y: 第二個運算元
        """
        return x + y

    def sub(self, x, y):
        return x - y

    def multiply(self, x, y):
        return x * y

    def devide(self, x, y):
        assert y != 0, "y引數不正確"
        return x / y

if __name__ == "__main__":
    # 初始化解析器
    parser = argparse.ArgumentParser()
    # 定義引數
    parser.add_argument("action", choices=["add", "sub", "multiply", "devide"], help="操作")
    parser.add_argument("x", type=int, help="第一個運算元")
    parser.add_argument("y", type=int, help="第二個運算元")
    parser.add_argument("-v", "--verbose", help="顯示詳細資訊", action="store_true")
    # 解析
    args = parser.parse_args()
    calculator = Calculator()
    if args.verbose:
        print "x=", args.x
        print "y=", args.y
        print "action=", args.action
    print "result:", getattr(calculator, args.action)(args.x, args.y)

2、click

Click 是flask作者用 Python 寫的一個第三方模組,用於快速建立命令列。Click 相比於 Argparse,就好比 requests 相比於 urllib

Click 則是以裝飾器的形式作用在目標函式中,要侵入函式本身,本質上還是對 argparse的一種改良作品。 一篇click使用的文章:http://python.jobbole.com/87111/

click的使用:

class Calculator(object):
    """
    計算器
    """

    def add(self, x, y):
        """
        加法運算
        Args:
            x: 第一個運算元
            y: 第二個運算元
        """
        return x + y

    def sub(self, x, y):
        return x - y

    def multiply(self, x, y):
        return x * y

    def devide(self, x, y):
        assert y != 0, "y引數不正確"
        return x / y

@click.command()  # 裝飾一個函式,使之成為命令列介面
@click.option("--verbose", type=click.BOOL, default=False, help="Show verbose info.")  # 定義選項,help還不支援中文,報編碼問題
@click.argument("action", type=click.Choice(["add", "sub", "multiply", "devide"]))  # 定義固定引數
@click.argument("x", type=click.INT)
@click.argument("y", type=click.INT)
def calc(action, x, y, verbose):
    calculator = Calculator()
    if verbose:
        print "x=", x
        print "y=", y
        print "action=", action
    print "result:", getattr(calculator, action)(x, y)

if __name__ == "__main__":
    calc()

3、fire

fire 這個命令列解析工具非常牛逼,把命令列工具做到了極致,算是一種顛覆式創新,

一行程式碼能把函式匯出到命令列視窗,該專案是 Google工程師開源的 Python 庫,雖然程式碼放到了google官方賬號下,但是專案主頁申明說它不是 Google 官方專案。

fire的使用:

# 用法1: fire.Fire()
# 直接在程式中呼叫 fire.Fire(),不需要修改目標函式,fire 會把當前模組下的所有物件匯出到命令列中

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

hello = "hello world"

if __name__ == "__main__":
    fire.Fire()



# 用法2: fire.Fire(<fn>)
# Fire 可以指定某個函式匯出到命令列

def add(x, y):
    return x + y

if __name__ == "__main__":
    fire.Fire(add)  # 當 Fire 接收函式 add 作為引數時,只加載 add 函式到命令列中,此時,在命令列中執行時也無需再指定函式名字,只需要指定引數就好。



# 用法3:fire.Fire(<dict>)
# Fire 不僅可以接收函式,還可以接收字典物件作為引數,可在字典中配置那些函式需要匯出到命令列中。例如,有加減乘3個函式,我們可以選擇性的選擇其中2個匯出到命令列。

def add(x, y):
    return x + y

def sub(x, y):
    return x - y

def test():
    return "test"

if __name__ == "__main__":
    fire.Fire({
        "add": add, 
        "sub": sub
    })



# 用法4:fire.Fire(<object>)
# Fire 還可以接收類的例項物件

if __name__ == "__main__":
    calculator = Calculator()
    fire.Fire(calculator)



# 用法5:fire.Fire(class)
# Fire 還可以接收一個類作為引數

if __name__ == "__main__":
    fire.Fire(Calculator)