初始化
假設我們創建一個“argp.py”的文件。
import argparse # 引入模塊 # 建立解析對象 parser = argparse.ArgumentParser() parser.add_argument("echo") # xx.add_argument("aa") # 給xx實例增加一個aa屬性 # 把parser中設置的所有"add_argument"給返回到args子類實例當中 # 那么parser中增加的屬性內容都會在args實例中,使用即可。 args = parser.parse_args() parser.parse_args() print(arg.echo) # 打印定位參數echo
運行的話,在python argp.py
后面加上abcd
(任意);
其將輸出“abcd”。因為我們把abcd
賦給了args.echo
了。
給其設置help:parser.add_argument("echo", help = "echo is here~")
在命令行中輸入:python argp.py -h
就可以得到相關的幫助信息。
type
假設我們寫一個文件,在命令行將其編譯時,同時輸入一個數字,返回一個平方:
因為parse.add_argument()
對於接受的值默認其為str,如果要將之視為int類型,額外加一句“type=int”。
import argparse parser = argparse.ArgumentParser() parser.add_argument("square", help = "To sqaure the number given", type = int) # 在命令行中,該py文件希望用戶能給他一個參數,最終將之轉化為:args.square args = parser.parse_arg() print(args.square**2)
有了type程序也可以自動過濾掉相關的不符合類型的參數輸入。
可選參數
在add_argument
前,給屬性名之前加上“—”,就能將之變為可選參數。
import argparse parser = argparse.ArgumentParser() parser.add_argument("--bool",help = "Whether to pirnt sth.") # 這里的bool是一個可選參數,返回給args的是 args.bool args = parser.parse_args() if arg.bool: print('bool = 1')
對於簡單程序,我們可能只需要兩種值True
orFalse
:輸入python argp.py --bool 1
得到bool = 1
既然是可選的,如果不指定(就是不使用它)的話,對應的變量會被設置為None。
對於簡單程序,我們可能只需要兩種值 True
orFalse
:
我們可以在原有的程序的基礎上,在add_argument
中多加一個參數:action = "store_true"
這個時候,只要在命令行中加個bool,args.bool就是True
了,無需再加上之后的賦值內容,加了反而會報錯。
但是,如果在parser.add_argument(..., required=True,type=int)
的話,那么這個參數就是必須的,因為他是required。
參數簡寫
parser.add_argument("-b","--bool",action="store_true")
這樣,在程序內部我們依舊使用args.bool
,但是在命令行當中我們只需要多寫一個“-b”就好了。
混合定位參數和可選參數
當我們使用多個parser.add_argument(...)
的時候,若將之視為可選參數,無則為None。
import argparse parser = argparse.ArgumentParser() parser.add_argument("-b","--bool",help="to show the ans in a sentencen form",action = "store_true") parser.add_argument("square",type=int) args = parser.parse_args() ans = args.square**2 if args.bool: print("the square of {} = {}".format(args.square,ans)) else: print(ans) # 得到的效果為:一旦輸入“-b”然后再輸入相關的參數,就可以得到我們需要的結果了,不輸入“-b”我們還是可以得到結果,只不過是另外一種方式而已。
限制輸入的值:進一步,我們可以進行以下操作,或者對之進行一些了解:
- 如
parser.add_argument("-b","--bool",choices=[0,1],help="you can only input 0 or 1.")
其中,choice
可以限定我們能夠輸入的數。 - 參數值和順序:
一般我們要把可選參數最后add,不可選參數放前面add。
而在命令行里面輸入代碼時,程序會先賦值“先add的參數選項”。
比如我先parser.add_argument(“a”,…)再b;
輸入命令行的時候:python xx.py x y
,這個時候,args.a=x ; args.b=y。 - count操作計數賦值:
parser.add_argument("-b","--bool",action="count",type=int)
這個時候,在命令后加上 -b ——> bool=1 ; -bb ——> bool=2 ;以此類推。
但是這樣的話,如果在程序里拿bool作為比較對象的時候,比如if bool > 0:
,不寫“-b”的時候會報錯,原因是此時的bool是None
,無法比較,要解決這個問題我們只需要加上一個 default 選項:parser.add_argument("-b","--bool",action="count",type=int,default=0)就好了。
高級用法
光上面那點知識,怕是根本算不上炫酷。我們肯定需要更牛逼的辦法。
- 一個py文件的文件名字為“__file__”
- 參數沖突:
我們可以通過group
方法,來讓group組的參數不可以被同時指定:import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-f","--form",action="store_true") group.add_argument("-F","--Form",action="store_true") parser.add_argument("x",type = float) parser.add_argument("y",type = float) args = parser.parse_args() ans = args.x**args.y if args.form: print("{} to the power {} equals {}".format(args.x, args.y, ans)) elif args.Form: print("{}^{} = {}".format(args.x,args.y,ans)) else: print(ans)
注意點:幫助信息中若有“[a | b]”就意味着,ab不可以同時使用。
- 在參數簡寫的時候不要定義“-h”,這個是給help用的。
- 如果你設置了幾個同類型(比如int)的可選參數,並且給他們簡寫參數了,比如:
x -> -x ; y -> -y …
那么在命令行賦值的時候就應該寫:... -x 10 -y 100
x = 10 ; y = 100 ;