天天看點

python3.x中argparse子產品詳解

python标準庫sys子產品

sys子產品

用于提供對Python解釋器相關的操作:

sys.argv           #指令行參數List,第一個元素是程式本身路徑
sys.exit(n)        #退出程式,正常退出時exit(0)
sys.version        #擷取Python解釋程式的版本資訊
sys.maxint       #  最大的Int值
sys.path           #傳回子產品的搜尋路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       #傳回作業系統平台名稱
sys.stdin          #輸入相關
sys.stdout         #輸出相關
sys.stderror       #錯誤相關           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
python指令行參數(sys.argv)
  • 有時候我們需要寫一些腳本處理一些任務,這時候往往需要提供一些指令行參數,根據不同參數進行不同的處理,在Python裡,指令行的參數和C語言很類似(因為标準Python是用C語言實作的)。在C語言裡,main函數的原型為int main(int argc, char ** argv),這裡主要指linux平台, argc指的是指令行傳入的參數個數(程式的name為第一個參數),而argv則是一個指針數組,每一個元素為指向一個指令行參數的指針。在Python裡的指令行參數是存儲在sys.argv裡,argv是一個清單,第一個元素也為程式名稱。
#### sys.argv練習
  import sys
  for i in sys.argv:
      print(i)
           

#if name == ‘main’:

# for item in sys.argv:

# print item

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

argparse子產品

作用: argparse 是 Python 内置的一個用于指令項選項與參數解析的子產品,通過在程式中定義好我們需要的參數,argparse 将會從 sys.argv 中解析出這些參數,并自動生成幫助和使用資訊。當然,Python 也有第三方的庫可用于指令行解析,而且功能也更加強大,比如

docopt

Click

1. 指令行參數分為位置參數和選項參數:
  • 位置參數就是程式根據該參數出現的位置來确定的
    • 如:[[email protected]_1 /]# ls root/ #其中root/是位置參數
  • 選項參數是應用程式已經提前定義好的參數,不是随意指定的
    • 如:[[email protected]_1 /]# ls -l # -l 就是ls指令裡的一個選項參數
2. 使用步驟:

(1)import argparse 首先導入子產品

(2)parser = argparse.ArgumentParser() 建立一個解析對象

(3)parser.add_argument() 向該對象中添加你要關注的指令行參數和選項

(4)parser.parse_args() 進行解析

3. argparse.ArgumentParser()方法參數須知:一般我們隻選擇用description
  1. description - 指令行幫助的開始文字,大部分情況下,我們隻會用到這個參數
  2. epilog - 指令行幫助的結尾文字
  3. prog - (default: sys.argv[0])程式的名字,一般不需要修改,另外,如果你需要在help中使用到程式的名字,可以使用%(prog)s
  4. prefix_chars - 指令的字首,預設是-,例如-f/–file。有些程式可能希望支援/f這樣的選項,可以使用prefix_chars=”/”
  5. fromfile_prefix_chars - (default: None)如果你希望指令行參數可以從檔案中讀取,就可能用到。例如,如果fromfile_prefix_chars=’@’,指令行參數中有一個為”@args.txt”,args.txt的内容會作為指令行參數
  6. add_help - 是否增加-h/-help選項 (default: True),一般help資訊都是必須的,是以不用設定啦。
  7. parents - 類型是list,如果這個parser的一些選項跟其他某些parser的選項一樣,可以用parents來實作繼承,例如parents=[parent_parser]
  8. 三個允許的值: # class argparse.RawDescriptionHelpFormatter 直接輸出description和epilog的原始形式(不進行自動換行和消除空白的操作) # class argparse.RawTextHelpFormatter 直接輸出description和epilog以及add_argument中的help字元串的原始形式(不進行自動換行和消除空白的操作) # class argparse.ArgumentDefaultsHelpFormatter 在每個選項的幫助資訊後面輸出他們對應的預設值,如果有設定的話。這個最常用吧!
  9. argument_default - (default: None)設定一個全局的選項的預設值,一般每個選項單獨設定,是以這個參數用得少,不細說
  10. usage - (default: generated)如果你需要修改usage的資訊(usage: PROG [-h] [–foo [FOO]] bar [bar …]),那麼可以修改這個,一般不要修改。
  11. conflict_handler - 不建議使用。這個在極端情況下才會用到,主要是定義兩個add_argument中添加的選項的名字發生沖突時怎麼處理,預設處理是抛出異常。
4. add_argument()方法參數須知:
  1. name or flags - 指定參數的形式,想寫幾個寫幾個,不過我們一般就寫兩個,一個短參數,一個長參數,看下面的例子”-f”, “–file”
  2. 可選的選項,位置不固定,想怎麼寫就怎麼寫,預設是可選的 # parser.add_argument(“-f”, “–file”, help=”test test test”)
  3. 位置固定的選項,例如”prog i_am_bar”,這樣子的話,i_am_bar就是bar選項的值啦,預設是必須有的 # parser.add_argument(“bar”, help=”test test test”)
  4. nargs - 指定這個參數後面的value有多少個,例如,我們希望使用-n 1 2 3 4,來設定n的值為[1, 2, 3, 4] #parser.add_argument(“-n”, “–num”, nargs=”+”, type=int) # 這裡nargs=”+”表示,如果你指定了-n選項,那麼-n後面至少要跟一個參數,+表示至少一個,?表示一個或0個,0個或多個 。
  5. default - 如果指令行沒有出現這個選項,那麼使用default指定的預設值 #parser.add_argument(“+g”, “++gold”, help=”test test test”,default=”test_gold”)#需要prefix_chars包含”+” 。
  6. type - 如果希望傳進來的參數是指定的類型(例如 float, int or file等可以從字元串轉化過來的類型),可以使用 #parser.add_argument(“-x”, type=int) 。
  7. choices - 設定參數值的範圍,如果choices中的類型不是字元串,記得指定type哦 #parser.add_argument(“-y”, choices=[‘a’, ‘b’, ‘d’])
  8. required - 通常-f這樣的選項是可選的,但是如果required=True那麼就是必須的了 #parser.add_argument(“-z”, choices=[‘a’, ‘b’, ‘d’], required=True)
  9. metavar - 參數的名字,在顯示 幫助資訊時才用到. # parser.add_argument(“-o”, metavar=”OOOOOO”)
  10. help - 設定這個選項的幫助資訊
  11. dest - 設定這個選項的值就是解析出來後放到哪個屬性中 #parser.add_argument(“-q”, dest=”world”)
  12. args = parser.parse_args(args) # 如果你沒有args參數,那麼就使用sys.argv,也就是指令行參數啦。有這個參數,就友善我們調試啊 。# args.world就是-q的值啦
  13. action - The basic type of action to be taken when this argument is encountered at the command line.
  14. const - A constant value required by some action and nargs selections.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo')     # add_argument()指定程式可以接受的指令行選項
args = parser.parse_args()      # parse_args()從指定的選項中傳回一些資料
print(args)
print(args.echo)
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
parser = argparse.ArgumentParser(description = 'this is a description')
parser.add_argument('--ver', '-v', action = 'store_true', help = 'hahaha')
# 将變量以标簽-值的字典形式存入args字典
args = parser.parse_args()
if args.ver:
    print("Ture")
else:
    print("False")
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
# required标簽就是說--ver參數是必需的,并且類型為int,輸入其它類型會報錯
parser.add_argument('--ver', '-v', required = True, type = int)
           
  • 1
  • 2
parser.add_argument('file', choices = ['test1', 'test2'])
args = parser.parse_args()
print('read in %s'%(args.file))
           
  • 1
  • 2
  • 3
# 表示腳本可以讀入兩個整數賦予num鍵(此時的值為2個整數的數組)
parser.add_argument('filename', nargs = 2, type = int)
args = parser.parse_args()
print('read in %s'%(args.filename))
           
  • 1
  • 2
  • 3
  • 4

分析:nargs還可以’*‘用來表示如果有該位置參數輸入的話,之後所有的輸入都将作為該位置參數的值;‘+’表示讀取至少1個該位置參數。’?'表示該位置參數要麼沒有,要麼就隻要一個。(PS:跟正規表達式的符号用途一緻。)

如:

parser.add_argument('filename', nargs = '+', type = int)
args = parser.parse_args()
print('read in %s'%(args.filename))
           
  • 1
  • 2
  • 3

dest - 設定這個選項的value解析出來後放到哪個屬性中

parser.add_argument('-file', choices = ['test1', 'test2'], dest = 'world')
args = parser.parse_args()
print('read in %s'%(args.world))
           
  • 1
  • 2
  • 3

add

如果腳本很簡單或臨時使用,沒有多個複雜的參數選項,可以直接利用sys.argv将腳本後的參數依次讀取(讀進來的預設是字元串格式)。比如如下名為test.py的腳本:

import sys
print "Input argument is %s" %(sys.argv)
           
  • 1
  • 2

在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!”

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

運作python test.py後面跟了–verbose/-v的時候會輸出前者,如果什麼都沒有會輸出後者。如果輸入了–verbose/-v以外的參數則會報錯:unrecognized arguments

稍微提一下,action參數表示值賦予鍵的方式,這裡用到的是bool類型;如果是’count’表示将–verbose标簽出現的次數作為verbose的值;'append’表示将每次出現的該便簽後的值都存入同一個數組再指派。(嘛,一般後面兩種用的比較少就不多說了)

PS:–help标簽在使用argparse子產品時會自動建立,是以一般情況不需要我們主動定義幫助資訊。

$ 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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 必需參數

    這種模式用于確定某些必需的參數有輸入。

parser.add_argument('--verbose', required=True, type=int)
           
  • 1

required标簽就是說–verbose參數是必需的,并且類型為int,輸入别的類型會報錯。

3)位置參數(positional arguments)

位置參數與sys.argv調用比較像,參數沒有顯式的–xxx或者-xxx标簽,是以調用屬性也與sys.argv相同。

parser.add_argument('filename')    # 輸入的第一個參數賦予名為filename的鍵
args = parser.parse_args()
print "Read in %s" %(args.filename)
           
  • 1
  • 2
  • 3

輸入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:跟正規表達式的符号用途一緻。)比如用:

parser.add_argument('filename')
parser.add_argument('num', nargs='*)
           
  • 1
  • 2

就可以運作python test.py text.txt 1 2

由于沒有标簽,是以用位置參數的時候需要比較小心。

4)輸入類型

之前已經提到了用type參數就可以指定輸入的參數類型。而這個type類型還可以表示檔案操作的類型進而直接進行檔案的讀寫操作。

parser.add_argument('file', type=argparser.FileType('r'))    # 讀取檔案
args = parser.parse_args()
for line in args.file:
    print line.strip()
           
  • 1
  • 2
  • 3
  • 4

5)參數預設值

一般情況下會設定一些預設參數進而不需要每次輸入某些不需要變動的參數,利用default參數即可實作。

parser.add_argument('filename', default='text.txt')
           
  • 1

這個時候至直接運作python text.py就能得到Read in text.txt而不需要輸入檔案名了。

6)候選參數選擇

表示該參數能接受的值隻能來自某幾個值候選值中,除此以外會報錯,用choices參數即可。比如:

parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])
           
  • 1

action參數

argparse内置6種動作可以在解析到一個參數時進行觸發:

store

儲存參數值,可能會先将參數值轉換成另一個資料類型。若沒有顯式指定動作,則預設為該動作。

store_const

儲存一個被定義為參數規格一部分的值,而不是一個來自參數解析而來的值。這通常用于實作非布爾值的指令行标記。

store_ture/store_false

儲存相應的布爾值。這兩個動作被用于實作布爾開關。

append

将值儲存到一個清單中。若參數重複出現,則儲存多個值。

append_const

将一個定義在參數規格中的值儲存到一個清單中。

version

列印關于程式的版本資訊,然後退出

import argparse
           

parser = argparse.ArgumentParser()

parser.add_argument(’-s’, action=‘store’, dest=‘simple_value’,

help=‘Store a simple value’)

parser.add_argument(’-c’, action=‘store_const’, dest=‘constant_value’,

const=‘value-to-store’,

help=‘Store a constant value’)

parser.add_argument(’-t’, action=‘store_true’, default=False,

dest=‘boolean_switch’,

help=‘Set a switch to true’)

parser.add_argument(’-f’, action=‘store_false’, default=False,

dest=‘boolean_switch’,

help=‘Set a switch to false’)

parser.add_argument(’-a’, action=‘append’, dest=‘collection’,

default=[],

help=‘Add repeated values to a list’)

parser.add_argument(’-A’, action=‘append_const’, dest=‘const_collection’,

const=‘value-1-to-append’,

default=[],

help=‘Add different values to list’)

parser.add_argument(’-B’, action=‘append_const’, dest=‘const_collection’,

const=‘value-2-to-append’,

help=‘Add different values to list’)

parser.add_argument(’–version’, action=‘version’, version=’%(prog)s 1.0’)

results = parser.parse_args()

print ‘simple_value =’, results.simple_value

print ‘constant_value =’, results.constant_value

print ‘boolean_switch =’, results.boolean_switch

print ‘collection =’, results.collection

print ‘const_collection =’, results.const_collection

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
$ python argparse_action.py -h
           

usage: argparse_action.py [-h] [-s SIMPLE_VALUE] [-c] [-t] [-f]

[-a COLLECTION] [-A] [-B] [–version]

optional arguments:

-h, --help show this help message and exit

-s SIMPLE_VALUE Store a simple value

-c Store a constant value

-t Set a switch to true

-f Set a switch to false

-a COLLECTION Add repeated values to a list

-A Add different values to list

-B Add different values to list

–version show program’s version number and exit

$ python argparse_action.py -s value

simple_value = value

constant_value = None

boolean_switch = False

collection = []

const_collection = []

$ python argparse_action.py -c

simple_value = None

constant_value = value-to-store

boolean_switch = False

collection = []

const_collection = []

$ python argparse_action.py -t

simple_value = None

constant_value = None

boolean_switch = True

collection = []

const_collection = []

$ python argparse_action.py -f

simple_value = None

constant_value = None

boolean_switch = False

collection = []

const_collection = []

$ python argparse_action.py -a one -a two -a three

simple_value = None

constant_value = None

boolean_switch = False

collection = [‘one’, ‘two’, ‘three’]

const_collection = []

$ python argparse_action.py -B -A

simple_value = None

constant_value = None

boolean_switch = False

collection = []

const_collection = [‘value-2-to-append’, ‘value-1-to-append’]

$ python argparse_action.py --version

argparse_action.py 1.0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

參考

  1. https://mkaz.tech/python-argparse-cookbook.html
  2. https://docs.python.org/2/howto/argparse.html

python标準庫sys子產品

sys子產品

用于提供對Python解釋器相關的操作:

sys.argv           #指令行參數List,第一個元素是程式本身路徑
sys.exit(n)        #退出程式,正常退出時exit(0)
sys.version        #擷取Python解釋程式的版本資訊
sys.maxint       #  最大的Int值
sys.path           #傳回子產品的搜尋路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       #傳回作業系統平台名稱
sys.stdin          #輸入相關
sys.stdout         #輸出相關
sys.stderror       #錯誤相關           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
python指令行參數(sys.argv)
  • 有時候我們需要寫一些腳本處理一些任務,這時候往往需要提供一些指令行參數,根據不同參數進行不同的處理,在Python裡,指令行的參數和C語言很類似(因為标準Python是用C語言實作的)。在C語言裡,main函數的原型為int main(int argc, char ** argv),這裡主要指linux平台, argc指的是指令行傳入的參數個數(程式的name為第一個參數),而argv則是一個指針數組,每一個元素為指向一個指令行參數的指針。在Python裡的指令行參數是存儲在sys.argv裡,argv是一個清單,第一個元素也為程式名稱。
#### sys.argv練習
  import sys
  for i in sys.argv:
      print(i)