Python 命令行參數工具 argparse

Python 在寫命令行腳本的時候,最直接的獲取參數的方法是使用 sys.argv()html

但若是參數較多較複雜,且腳本會長期使用,或給別人使用。那麼提供一套完整友好的命令行參數接口就比較可取了。python

argparse 包是標準包,提供參數解析、校驗、默認值、提示、幫助等一系列功能。命令行

假設需求爲一個以日期爲參數的腳本,它容許參數爲:code

  • 空,此時默認取昨天
  • '%Y-%m-%d' 格式的字符串,處理這個日期
  • '%Y-%m-%d:%Y-%m-%d' 格式的字符串,處理日期區間

例:orm

if __name__ == '__main__':
    yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime(DT_FORMAT)
    parser = argparse.ArgumentParser()
    parser.add_argument('date', nargs='?', default=yesterday, help='date, like "2016-08-18"')
    parser.add_argument('-r', '--range', help='date range, like "2016-08-18:2016-08-20"')
    args = parser.parse_args()
    if args.range:
        try:
            start, end = args.range.split(':')
            start_date = datetime.datetime.strptime(start, DT_FORMAT)
            end_date = datetime.datetime.strptime(end, DT_FORMAT)
        except ValueError as e:
            print(u'-r 參數錯誤:\n\t {}'.format(e))
            parser.print_help()
        else:
            date = start_date
            while date <= end_date:
                main(date)
                date += datetime.timedelta(days=1)
    else:
        date = datetime.datetime.strptime(args.date, DT_FORMAT)
        main(date)

基本思路就是:htm

  1. 實例化一個 argparse.ArgumentParser 對象
  2. 經過 add_argument() 添加一系列參數規則
  3. 調用 parse_args() 獲得參數,或打印異常信息

重點在於 add_argument() 的各類參數用法:對象

  • 第一位置參數爲字符串參數名,前面不加任何前綴表示位置參數(如 date),加兩個短橫線表示可選命名參數(如 --verbose),加一個短橫線表示可選命名參數的縮寫版(如-v)。
  • 那麼問題來了,假如我想使用可選位置參數怎麼辦,好比上例的日期,我想他默認是昨天,所以能夠不填,那麼就要使用 nargs 參數,它指明參數數量,能夠是 1,0 或者 ? 表示不定。
  • 那麼問題又來了,像 --verbose 這種參數,正經常使用法都是後面什麼都不接的,給出這個參數名就表明 true,不寫就表明 false,該怎麼處理呢。答案就是 action 參數,它表明當用戶給出本參數名時應該採起的操做。以 --verbose 爲例,能夠設爲 action='store_true',這樣無論用戶的 --vrebose 後面跟什麼,跟不跟,args.verbose 的值都是 True。不然當用戶只寫了可選命名參數的參數名,卻沒寫值的時候,ArgumentParser 的默認作法是返回一個 None

詳參:接口

Tutorial字符串

Referenceget

相關文章
相關標籤/搜索