argparse模塊
基本用法
import argparse
parser = argparse.ArgumentParser()
parser.add_argment('-v', '--Verbose', help='Help Text', type=str, action='store', ...)
args = parser.parse_args()
print(args.v)
ArgumentParser類的常用參數
- prog: 程序的名稱(默認是: sys.argv[0])
- usage: 程序使用方法說明 (默認由自動生成)
- description: 程序的介紹
- epilog: 程序的補充介紹, 該文字在參數介紹后邊
- prefix_chars: 定義optional參數的前綴,默認是'-'和'--', 如果我們設置 prefix_char='-+', 那么我們可以定義以'+'或'++'為前綴的optional參數.
- allow_abbrev: 允許對長可選參數進行縮寫(默認值), 例如:你定義了'--verbose',那么在CLI中--ver等價于--verbose, 可以通過設置allow_abbrev=False禁用縮寫.
add_argument()方法
該方法是用來向ArgumentParser類對象中加入參數的, 加入的參數可以是位置參數可以是 可選參數 也可以是標記
add_argument()的參數包括:
> name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.
> action - The basic type of action to be taken when this argument is encountered at the command line.
> nargs - The number of command-line arguments that should be consumed.
> const - A constant value required by some action and nargs selections.
> default - The value produced if the argument is absent from the command line.
> type - The type to which the command-line argument should be converted.
> choices - A container of the allowable values for the argument.
> required - Whether or not the command-line option may be omitted (optionals only).
> help - A brief description of what the argument does.
> metavar - A name for the argument in usage messages.
> dest - The name of the attribute to be added to the object returned by parse_args().
Name or Flags
位置參數(positional arguments)
代碼示例
parser.add_argument('hostname', help='server host name', type=str)
可選參數(optional arguments)
代碼示例
parser.add_argument('-p', '--port', help='the port number', type=int)
Action
-
store
這是默認值, 僅僅是把可選參數的值進行存儲import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', '--address', help='server address', type=str, action='store') args = parser.parse_args() print(args.address) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -a 19.1.1.1 19.1.1.1
-
store_const
這個action通常配合const參數一起使用,為可選參數設置默認值,把可選參數作為標記使用.import argparse parser = argparse.ArgumentParser() parser.add_argument('-t', '--test', help='test store_const action', action='store_const', const=80) args = parser.parse_args() print(args.test) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -t 80
-
store_true | store_false
這兩個action和'store_const'類似, 不過不需要配合const參數, store_true就是為指定可選參數設置True, store_false就是為指定的可選參數設置Falseimport argparse parser = argparse.ArgumentParser() parser.add_argument('-p','--passed', help='passed the exam or not', action='store_true') parser.add_argument('-f', '--fail', help='fail in the exam or not', action='store_false') args = parser.parse_args() print(args.passed, args.fail) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py False True [LiangZhang@MacBook test]$python3 arguments.py -p -f True False [LiangZhang@MacBook test]$python3 arguments.py -p True True [LiangZhang@MacBook test]$python3 arguments.py -f False False
-
append
這個參數主要用于同一個可選參數使用多次時, 可以把這些參數的值放入一個列表.import argparse parser = argparse.ArgumentParser() parser.add_argument('-p','--port', help='ports', type=int, action='append') args = parser.parse_args() print(args.port) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 21 -p 23 -p 80 [21, 23, 80]
-
append_const
這個action的作用是 把多個具有默認值的可選標記的值存放到一個列表import argparse parser = argparse.ArgumentParser() parser.add_argument('-w','--web', dest='var_list', action='append_const', const=80) parser.add_argument('-t', '--telent', dest='var_list', action='append_const', const=21) #參數dest指定所追加的參數值存入的列表名 args = parser.parse_args() print(args.var_list) #var_list容納參數的列表名, 由dest=var_list定義 OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -t -w [21, 80] [LiangZhang@MacBook test]$python3 arguments.py -tw [21, 80] [LiangZhang@MacBook test]$python3 arguments.py -wt [80, 21]
-
count
用于統計某一可選標記出現次數import argparse parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='count') args = parser.parse_args() print(args.verbose) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -v 1 [LiangZhang@MacBook test]$python3 arguments.py -vvv 3 [LiangZhang@MacBook test]$python3 arguments.py -v -v 2
-
version
用于顯示當前程序版本import argparse parser = argparse.ArgumentParser() parser.add_argument('-v', '--version', action='version', version='%(prog)s 2.0') args = parser.parse_args() print(args.version) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -v arguments.py 2.0
nargs
用于指定某位置參數或可選參數能接受參數值的個數.
-
nargs=N (N為參數個數)
import argparse parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', help='port list', nargs=3) parser.add_argument('-t', '--type', help='protocol type', nargs=2) parser.add_argument('host', help='host address', nargs=2) args = parser.parse_args() print(args.ports, args.type, args.host) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 23 22 53 -t tcp udp 192.168.1.1 www.baidu.com ['23', '22', '53'] ['tcp', 'udp'] ['192.168.1.1', 'www.baidu.com']
-
nargs='?' (只接收一個參數)
當nargs為'?'時, 代表該位置參數或可選參數只接收一個參數值, 并且我們可以為位置參數設置默認值(default), 以及為可選參數設置默認值(default)和常量值(const)
默認值和常量值的區別: 對于可選參數, 默認值指的是未給出可選參數標記(如:-p)時,該參數的值, 而常量值指的是給出可選參數標記(如: -p),但未給出參數值時,該可選參數的值.
注意: nargs=N時, 不可以為參數設置默認值和常量值, 所以nargs='?'是有意義的.
```python
parser = argparse.ArgumentParser()
parser.add_argument('host', nargs='?', default='www.cciex.com')
parser.add_argument('--port', '-p', nargs='?', const=23, default=22) #給出標記'-p' 不給值時 結果為'const', 如果 不給出標記'-p' 結果為'default'.
args = parser.parse_args()
print(args.port, args.host)
OUTPUT:
[LiangZhang@MacBook test]$ python3 arguments.py www.baidu.com -p 88
88 www.baidu.com
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$python3 arguments.py -p
23 www.cciex.com
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$python3 arguments.py
80 www.cciex.com
```
**args='?' 的常用方式**
這個參數用法,經常被用于可選的文件輸入和輸出
```python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--infile', '-i', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
parser.add_argument('--outfile', '-o', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
args = parser.parse_args()
for line in args.infile:
print(line)
args.outfile.write(line)
print('Done!')
------------
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py
both of input and output are not given^_^ #這是從標準輸入輸入的測試字符
both of input and output are not given^_^ #這是print()打印出的測試字符
both of input and output are not given^_^ #這是從標準輸出輸出的測試字符
Done! # 使用Ctl+D 終止輸入
-------------
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py --outfile test.txt #給定輸出文件參數
this time --outfile has been specified ^_^ #這是從標準輸入輸入的測試字符 this time --outfile has been specified ^_^ #這是print()打印出的測試字符
Done! # 使用Ctl+D 終止輸入
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$cat test.txt #使用cat查看輸出文件
this time --outfile has been specified ^_^ #輸出文件內容等于輸入
```
-
args='*' (接受所有參數)
所有參數全部被接收,并存入一個列表. 為多個位置參數使用'args="*" 沒有意義.
如果沒有給定任何參數值, 則返回空列表.import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', nargs='*') parser.add_argument('host', nargs='*') args = parser.parse_args() print(args.host, args.ports) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p 23 22 80 ['www.baidu.com', 'www.cciex.com'] ['23', '22', '80']
-
args='+' (接受所有參數,要求至少有一個參數)
如果沒有給定任何參數值,則生成異常.import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', nargs='+') parser.add_argument('host', nargs='*') args = parser.parse_args() print(args.host, args.ports) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p 23 80 443 ['www.baidu.com', 'www.cciex.com'] ['23', '80', '443'] [LiangZhang@MacBook test]$ [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p #不給定參數返回異常 usage: arguments.py [-h] [-p PORTS [PORTS ...]] [host [host ...]] arguments.py: error: argument -p/--ports: expected at least one argument [LiangZhang@MacBook test]$ [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com #不給定標記 返回None ['www.baidu.com', 'www.cciex.com'] None
-
args=argparse.REMAINDER (把剩余的參數放入一個列表)
import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('host', nargs=1, default='www.cciex.com') parser.add_argument('-p', '--ports', nargs='?', const=80, default=80) parser.add_argument('remains', nargs=argparse.REMAINDER) args = parser.parse_args() print(args.host, args.ports, args.remains) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 443 www.baidu.com admin root mark ['www.baidu.com'] 443 ['admin', 'root', 'mark'] %%注意:%% args=argparse.REMAINDER的'吞噬能力'很強, 所以在CLI中輸入參數時, 不要把可選參數放在REMAINDER之前, 否則連同可選參數標記(-p)和可選參數值(例:443),全部會被認定為剩余參數. OUTPUT2: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com -p 443 admin root mark ['www.baidu.com'] 80 ['-p', '443', 'admin', 'root', 'mark']
const (參數常量)
- 為可選參數設置參數常量值, 當在CLI中只給出了參數標記,但沒有給出參數值時, 該常量為參數值, 代碼樣例見: Action章節的 'store_const' 和 'append_const'
default (參數默認值)
- 可以做為可選參數和位置參數的默認值, 當位置參數未給出,或是可選參數標記未給出, 那么參數值為默認值. 代碼樣例見: nargs='?' 等多處章節.
type (規定參數類型)
-
用于將CLI中輸入的參數轉換為指定的類型, 當類型無法轉換時產生異常.
parser.add_argument('-p', '--port', type=int) #如果輸入是非數字的字符,則產生異常
也可以用于將輸入的字符做出文件名,返回文件句柄. 樣例: 見 args='?' 常用方法章節.
-
也可以自定義類型轉換函數.
def perfect_square(string): #用于測試一個參數是否能夠被完全開平方 value = int(string) #轉換輸入為整型 sqrt = math.sqrt(value) #對輸入開方 if sqrt != int(sqrt): #把平方根的值 和 int轉換后的平方根對比, 如果一致說明平方根是整數, 原輸入值可以被完全開方. msg = "%r is not a perfect square" % string raise argparse.ArgumentTypeError(msg) #如果不能被完全開方, 那么生成異常. return value #如果可以被完全開發, 返回轉換為整型的原輸入 parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('foo', type=perfect_square) parser.parse_args(['9']) #模擬輸入9, 測試OK Namespace(foo=9) parser.parse_args(['7']) #模擬輸入7, 返回異常 usage: PROG [-h] foo PROG: error: argument foo: '7' is not a perfect square
choices
用于為位置參數或可選參數設限定一個范圍.
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('name', choices=['mark', 'Eric', 'Jonan'])
parser.add_argument('-f', '--food', choices=['Jiaozi', 'rice'])
args = parser.parse_args()
print(args.name, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py mark -f Jiaozi
mark Jiaozi
[LiangZhang@MacBook test]$python3 arguments.py mark -f shrimp #參數不在給定范圍時,會給出錯誤提示.
usage: arguments.py [-h] [-f {Jiaozi,rice}] {mark,Eric,Jonan}
arguments.py: error: argument -f/--food: invalid choice: 'shrimp' (choose from 'Jiaozi', 'rice')
required
通常來講, 諸如-f或--foo 一般被視為可選參數, 在CLI中可以添加也可以不加, 可以通過設置required=True 來指定該可選參數為必選參數.
parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', required=True) #指定CLI中必須包含-f參數
args = parser.parse_args()
help
對參數的一個功能描述, 當用戶使用-h時, 會顯示該描述.
parser = argparse.ArgumentParser(prog='frobble')
parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling')
metavar
用于自定義幫助信息(-h得到的輸出)中的位置參數和可選參數的參數值的展示樣例.
默認help輸出中的位置參數的參數值示例直接使用位置參數名稱, 可選參數的參數值樣例則是把可選參數大寫, 如下:
parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date')
parser.add_argument('-f', '--food', help='your favorite food')
args = parser.parse_args()
print(args.date, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f FOOD] date #輸出中的FOOD是可選參數的大寫形式, 'date'直接使用位置參數名.
positional arguments:
date current date
optional arguments:
-h, --help show this help message and exit
-f FOOD, --food FOOD your favorite food
使用metavar之后的代碼:
parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date', metavar='YY-MM-DD')
parser.add_argument('-f', '--food', help='your favorite food', metavar='Food_Name')
args = parser.parse_args()
print(args.date, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f Food_Name] YY-MM-DD #Food_Name和YY-MM-DD均使用了自定義的示例名稱
positional arguments:
YY-MM-DD current date
optional arguments:
-h, --help show this help message and exit
-f Food_Name, --food Food_Name
your favorite food
如果使用nargs參數后, 那么一個可選參數可能需要接受多個參數值, 這時我們可以為metavar傳出一個元組, 為多個參數值設置示例名:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
OUTPUT:
usage: PROG [-h] [-x X X] [--foo bar baz] #為--foo的兩個參數值設置不同的示例名
dest
dest是一個argpars.ArgumentParser對象被解析以后, args引用參數值的變量名稱.
默認:
- 位置參數的dest為位置參數的參數名
- 可選參數的dest為:
- 合規長參數去掉前綴'--', 如: --foo的dest為foo
- 不合規長參(參數名包含'-')數去掉前綴'--', 并且把參數名中的'-'變為' _ ', 例如: --food-name的dest為food_name.
- 如果沒有長參數, 那么短參數去掉前綴'-', 如: -p的dest為p
例如:
parser.add_argument('date', help='current date', metavar='YY-MM-DD') #date為該參數的dest
parser.add_argument('-f', '--food-name', help='your favorite food', metavar='FoodName') #food_name為該參數的dest
args = parser.parse_args()
print(args.date, args.food_name) #date和food_name為 dest
可以使用dest參數自己定義dest名稱
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--food', dest='snack', help='your favorite food',) #snack為--food的dest名稱
args = parser.parse_args()
print(args.snack) #我們需要使用args.snack來引用參數--food的參數值.