parse_args(argsparse):python和命令行之間的交互


初始化

假設我們創建一個“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')

對於簡單程序,我們可能只需要兩種值TrueorFalse:輸入
python argp.py --bool 1
得到
bool = 1
既然是可選的,如果不指定(就是不使用它)的話,對應的變量會被設置為None。

對於簡單程序,我們可能只需要兩種值 TrueorFalse

我們可以在原有的程序的基礎上,在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 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM