在多個文件或者不一樣語言協同的項目中,python腳本常常須要從命令行直接讀取參數。萬能的python就自帶了argprase包使得這一工做變得簡單而規範。PS:optparse包是相似的功能,只不過寫起來更麻煩一些。html
若是腳本很簡單或臨時使用,沒有多個複雜的參數選項,能夠直接利用sys.argv
將腳本後的參數依次讀取(讀進來的默認是字符串格式)。好比以下名爲test.py的腳本:python
import sys print "Input argument is %s" %(sys.argv)
在shell腳本中運行python test.py help
能夠獲得Input argument is help
的結果。
1) 通常形式
可是大多數狀況下,腳本極可能須要多個參數,並且每次參數的類型用處各不相同,那麼這個時候在參數前添加標籤代表參數的類型和用途便十分有用,而利用argparse模塊能夠很方便得實現這一目的。
一樣用名爲test.py的腳本舉個栗子:正則表達式
import argparse parser = argparse.ArgumentParser(description="your script description") # description參數能夠用於插入描述腳本用途的信息,能夠爲空 parser.add_argument('--verbose', '-v', action='store_true', help='verbose mode') # 添加--verbose標籤,標籤別名能夠爲-v,這裏action的意思是當讀取的參數中出現--verbose/-v的時候 # 參數字典的verbose建對應的值爲True,而help參數用於描述--verbose參數的用途或意義。 args = parser.parse_args() # 將變量以標籤-值的字典形式存入args字典 if args.verbose: print "Verbose mode on!" else: print "Verbose mode off!"
運行python test.py
後面跟了--verbose/-v的時候會輸出前者,若是什麼都沒有會輸出後者。若是輸入了--verbose/-v之外的參數則會報錯:unrecognized arguments
稍微提一下,action參數表示值賦予鍵的方式,這裏用到的是bool類型;若是是'count'表示將--verbose標籤出現的次數做爲verbose的值;'append'表示將每次出現的該便籤後的值都存入同一個數組再賦值。(嘛,通常後面兩種用的比較少就很少說了)
PS:--help標籤在使用argparse模塊時會自動建立,所以通常狀況不須要咱們主動定義幫助信息。shell
$ python test.py --help usage: test.py [-h] [--verbose] your script description optional arguments: -h, --help show this help message and exit --verbose, -v verbose mode
2) 必需參數
這種模式用於確保某些必需的參數有輸入。
parser.add_argument('--verbose', required=True, type=int)
required標籤就是說--verbose參數是必需的,而且類型爲int,輸入別的類型會報錯。數組
3)位置參數(positional arguments)
位置參數與sys.argv調用比較像,參數沒有顯式的--xxx或者-xxx標籤,所以調用屬性也與sys.argv相同。bash
parser.add_argument('filename') # 輸入的第一個參數賦予名爲filename的鍵 args = parser.parse_args() print "Read in %s" %(args.filename)
輸入python test.py test.txt
則會輸出Read in test.txt
此外,能夠用nargs參數來限定輸入的位置參數的個數,默認爲1。固然nargs參數也可用於普通帶標籤的參數。
parser.add_argument('num', nargs=2, type=int)
表示腳本能夠讀入兩個整數賦予num鍵(此時的值爲2個整數的數組)。nargs還能夠'*'用來表示若是有該位置參數輸入的話,以後全部的輸入都將做爲該位置參數的值;‘+’表示讀取至少1個該位置參數。'?'表示該位置參數要麼沒有,要麼就只要一個。(PS:跟正則表達式的符號用途一致。)好比用:app
parser.add_argument('filename') parser.add_argument('num', nargs='*)
就能夠運行python test.py text.txt 1 2
因爲沒有標籤,因此用位置參數的時候須要比較當心。ui
4)輸入類型
以前已經提到了用type參數就能夠指定輸入的參數類型。而這個type類型還能夠表示文件操做的類型從而直接進行文件的讀寫操做。this
parser.add_argument('file', type=argparser.FileType('r')) # 讀取文件 args = parser.parse_args() for line in args.file: print line.strip()
5)參數默認值
通常狀況下會設置一些默認參數從而不須要每次輸入某些不須要變更的參數,利用default參數便可實現。命令行
parser.add_argument('filename', default='text.txt')
這個時候至直接運行python text.py
就能獲得Read in text.txt
而不須要輸入文件名了。
6)候選參數選擇
表示該參數能接受的值只能來自某幾個值候選值中,除此之外會報錯,用choices參數便可。好比:
parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])
參考:https://mkaz.tech/python-argparse-cookbook.html
https://docs.python.org/2/howto/argparse.html