Python標准模塊--argparse


1 模塊簡介

你一定很奇怪Python是如何命令行中的變量的吧?argparse就是用來解決這個問題的,argparse是optparse的替代。

2 模塊使用

2.1 開始

我發現解釋一個編程的概念,最簡單的方式就是用一段代碼來展示。下面就是一段超級簡單的代碼,

import argparse

parser = argparse.ArgumentParser(
            description = "A simple argument parser",
            epilog = "This is where you might put example usage"
            )

parser.print_help()

控制台輸出,

usage: main.py [-h]

A simple argument parser

optional arguments:
  -h, --help  show this help message and exit

This is where you might put example usage

這里,我們僅僅是引入argparse,然后設置了描述和使用部分。這里主要是當你向你所創建的程序尋求幫助時,它將會告訴你如何使用它。在這個例子中,它打印出簡單的描述,默認的選項("-h")和使用示例。

我們讓這個例子更加的具體,你一般是通過命令行傳遞參數,因此將代碼移到Python文件中的一個函數。

import argparse

def get_args():
    parser = argparse.ArgumentParser(
                description = "A simple argument parser",
                epilog = "This is where you might put example usage"
                )
    return parser.print_help()

if __name__ == "__main__":
    get_args()

在命令行中運行腳本,

python main.py -h

將會顯示出我們之前看到的文本信息,現在,我們開始學習如何添加我們需要的變量吧。

2.2 添加變量

下面一段代碼是添加三個新的我們的parser可以理解的變量。我們添加一個必須要求的變量,另外兩個不是必須要求的,我們也可以添加一個默認和一個必須要求的類型。

import argparse

def get_args():
    parser = argparse.ArgumentParser(
                description = "A simple argument parser",
                epilog = "This is where you might put example usage"
                )
    # required argument
    parser.add_argument('-x',action = "store",required = True,help = "Help text for option X")
    # optional argument
    parser.add_argument('-y',help = "Help text for option Y",default = False)
    parser.add_argument('-z',help = "Help text for option Z",type = int)
    print(parser.parse_args())

if __name__ == "__main__":
    get_args()

控制台輸出,

zhb@zhb-VM:~/workspace/PythonTest$ python main.py
usage: main.py [-h] -x X [-y Y] [-z Z]
main.py: error: argument -x is required
zhb@zhb-VM:~/workspace/PythonTest$ python main.py -x something
Namespace(x='something', y=False, z=None)
zhb@zhb-VM:~/workspace/PythonTest$ python main.py -x something -y text
Namespace(x='something', y='text', z=None)
zhb@zhb-VM:~/workspace/PythonTest$ python main.py -x something -z text
usage: main.py [-h] -x X [-y Y] [-z Z]
main.py: error: argument -z: invalid int value: 'text'
zhb@zhb-VM:~/workspace/PythonTest$ python main.py -x something -z 10
Namespace(x='something', y=False, z=10)

正如你所看到的,如果你不傳入任何變量,而直接運行代碼,你將會出錯。然后,我們僅僅傳入要求的變量,你可以看到對於其它兩個變量直接使用默認值。再然后,我們試圖將"text"傳給"-y"變量並將它存儲下來,所以,我們直到它並不要求是布爾類型。最后兩個例子顯示當你傳入一個無效和有效的值給"-z"時的結果。

到此,變量名字不需要只有一個字符,你可以修改它,讓它的描述性更強,例如"arg1"或者"simulator"或者任何你想要的。

2.3 短選項和長選項

下面我們將會學習如何使用短選項和長選項,我們實際上已經使用了短選項,

parser.add_argument('-x',action = "store",required = True,help = "Help text for option X")

如果我們想使用長選項,我們僅僅需要在短選項的右邊添加長選項,如下所示,

parser.add_argument('-x','--execute', action = "store",required = True,help = "Help text for option X")

你將會注意到長選項不止一個字符,並且它必須要以兩個破折號開始,而不是一個。

2.4 選項沖突

如果兩個選項相互沖突,你該如何解決?一個常見的例子就是在調試模式還是在靜音模式下,運行你的應用?你可以在任意一種模式下運行,但是不能同時在兩種模式下運行。我們如何防止用戶以這種方式運行呢?一種簡單的方式就是通過mutually_exclusie_group函數,假設選項x和選項y不能同時運行。

import argparse

def get_args():
    parser = argparse.ArgumentParser(
                description = "A simple argument parser",
                epilog = "This is where you might put example usage"
                )
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-x','--execute', action = "store",help = "Help text for option X")
    group.add_argument('-y',help = "Help text for option Y",default = False)
    parser.add_argument('-z',help = "Help text for option Z",type = int)
    print(parser.parse_args())

if __name__ == "__main__":
    get_args()

你將會注意到我們創建了一個手動排它的群組,我們將需要手動排它的選項添加到群組,剩下的選項繼續添加到常規的parser群組,讓我們嘗試着在命令行中輸入如下命令,

zhb@zhb-VM:~/workspace/PythonTest$ python main.py -x 10 -y 2

當我們執行這條命令,控制台輸出,

usage: main.py [-h] [-x EXECUTE | -y Y] [-z Z]
main.py: error: argument -y: not allowed with argument -x/--execute

很明顯,它並沒有執行成功,並且argparse模塊告訴我們什么原因。

2.5 總結

你現在了解了如何創建一個基本的變量解析器。這個模塊還有許多其它你可能感興趣的用法,例如定義一個交替的目標名稱用於保存,使用不同的前綴,創建變量群組等等。我推薦你去閱讀官方文檔。

3 Reference

Python 201


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com