python 命令列參數解析 argparse簡單分析

來源:互聯網
上載者:User

標籤:python   argparse   變參   位置參數   正則匹配   

在python 2.7 後,不推薦使用 optparse, 而推薦使用 argparse.

其它的不多說,簡單的分析下我遇到的問題:我是想用 argparse 來解析不定長的命令列參數

例如:

import argparseimport sysparser = argparse.ArgumentParser(description='test parsing arguments')parser.add_argument('pos1', nargs='*')parser.add_argument('pos2')parser.add_argument('-o1')parser.add_argument('-o2')parser.add_argument('pos3', nargs='*')print sys.argv# arg = parser.parse_args(sys.argv[1:])arg = parser.parse_known_args(sys.argv[1:])print arg# print parser.print_help()

假設將上面的代碼儲存在 test.py 檔案中,在命令列中做如下測試:

input:   python test.py a b c -o1 d e -o2 f g h

output:

[‘test.py‘, ‘a‘, ‘b‘, ‘c‘, ‘-o1‘, ‘d‘, ‘e‘, ‘-o2‘, ‘f‘, ‘g‘, ‘h‘]
(Namespace(o1=‘d‘, o2=‘f‘, pos1=[‘a‘, ‘b‘], pos2=‘c‘, pos3=[]), [‘e‘, ‘g‘, ‘h‘])


input: python test.py a  -o1 b c  -o2 d e f g h
output:

[‘test.py‘, ‘a‘, ‘-o1‘, ‘b‘, ‘c‘, ‘-o2‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘]
(Namespace(o1=‘b‘, o2=‘d‘, pos1=[], pos2=‘a‘, pos3=[]), [‘c‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘])

input: python test.py -o1 a b c  -o2 d e f g h

output:

[‘test.py‘, ‘-o1‘, ‘a‘, ‘b‘, ‘c‘, ‘-o2‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘]
(Namespace(o1=‘a‘, o2=‘d‘, pos1=[‘b‘], pos2=‘c‘, pos3=[]), [‘e‘, ‘f‘, ‘g‘, ‘h‘])

input: python test.py -o1 a -o2 b c d e f g h

output:

[‘test.py‘, ‘-o1‘, ‘a‘, ‘-o2‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘]
(Namespace(o1=‘a‘, o2=‘b‘, pos1=[‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘], pos2=‘h‘, pos3=[]), [])

做如上四組測試,傳入的參數都一樣(唯一不一樣的就是位置), 但是得到了不同的結果。

究其原因,這就是 argparse 模組的實現原理。 採用了正則匹配的方式 來解析參數(正則的說法屬於個人理解,沒有關注源碼,如果有誤,望更正)

在 add_argument 添加參數規則的時候,我們把帶 ‘-‘ 的叫做選項參數,不帶 ‘-‘ 的叫做位置參數。 下面我們以位置參數為例

在上面的代碼中 通過 add_argument 添加了 pos1,pos2,pos3 三個位置參數,他們構成的 Regex為 A*AA*,其中A*代表匹配0個或多個值。

在測試例子1中的參數列表中,首先遇到位置參數 a b c ,這正好與 A*AA*的模式比對,即 pos1=[a,b] pos2=c, pos3=[],因為A*AA*是貪婪匹配模式,即儘可能多的得到值,所以pos1=[a,b]而pos3=[]

在測試例子4中的參數列表中,A*AA* 匹配到參數列表中的 c d e f g h, 在貪婪匹配模式下,即可得到 pos1=[c,d,e,f,g], pos2=h, pos3=[]


通過分析上面兩個例子,我們只需要記住 argparse 解析參數是根據 add_argument 添加的規則來進行模式比對。就可以較好的理解解析的結果了!


最後,感謝博文 http://4byte.cn/question/347481/argparse-how-to-handle-variable-number-of-arguments-nargs.html 的分享

python 命令列參數解析 argparse簡單分析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.