python argparse小記


argparse模塊是從命令行向程序傳參用的,本文參考官網(https://docs.python.org/2/howto/argparse.html
1.最簡單的
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)

  運行時程序名加echo的值,如:

python main.py 5

2.上面這樣的參數來多了運行時記不住啊,怎么辦?給起個名字

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--echo")
args = parser.parse_args()
print(args.echo)

  運行時就能區分啦:python 111.py --echo 5

3.好記是好記了,但是不好敲啊,這么長,怎么辦?起個縮寫

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo")
args = parser.parse_args()
print(args.echo)

  這樣,每次運行時用縮寫就可以了:python 111.py -e 5,當然,現在全稱依舊是可以用的

4.僅用一個單詞代表一個變量,當時還好,過一段時間,自己的代碼自己都不認識了,所以,備注可不能少了,args模塊還提供了一個高級玩法:help

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo",help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
print(args.echo)

  這樣的好處是什么呢?那就是你不用跑到代碼行里去找注釋了,用的時候直接:python 111.py -h,就會顯示

usage: 111.py [-h] [-e ECHO]

optional arguments:
  -h, --help            show this help message and exit
  -e ECHO, --echo ECHO  這是一段備注,防止自己的代碼自己不認識

  -h,就是help的縮寫,函數自帶的參數,注意自己給自定義參數縮寫時別沖突了吖。是不是很方便?

5.有沒有愛上args函數呢?但是實際使用還是有點麻煩,所有傳入的參數都是str類型的,因為python可以自動判斷變量類型,開始這樣設計時為了方便我們使用,但是有的時候反而不方便,比如,我要傳進去數字5,於是:python 111.py -e 5   (代碼沒變,與4一樣)

但是打印一下:

print(type(args.echo))

--------------------------------
你會發現
<class 'str'>

  這也可以理解,5既可以是數字也可以是str,產生了歧義,python君就自作主張,都變成了str,可我明明要數字,每次傳參進來我還要手動轉換,這也他不智能了叭。別急,你想到的,大神們也想到了,於是加上了類型選擇type=:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo",type=int,help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
print(type(args.echo))

  運行一下>python 111.py -e 5,結果:<class 'int'>,果然好用。

6.但是5中類型定義有一個坑,那就是bool,不管賦值時True還是False,傳參進去得到的都是True,這是因為,這個變量在接受到命令行傳來的參數以后直接判斷是否有值,False倏然表示假,但是他自身也是一個值,於是程序就傻傻的認為有值,於是都是True啦,可是不給他傳值,args函數自身的糾錯機制會報錯,於是~~~。

解決方法也有很多,有興趣的小伙伴們可以到網上自己找一下,這里我只介紹一種我自己比較常用的,action="True":

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo",action="store_true",help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
# print(type(args.echo))
print(args.echo)

  其他類型都是給個變量名之后必須跟一個值,但是action同學與眾不同,只有變量名就管用啦。來試試:

運行  python 111.py -e  得到結果  True

運行  python 111.py  得到結果  False

是不是就完美實現了bool的功能呢?只要思想不滑坡,辦法總比困難多。

7.用好前6條,基本的args就可以用起來了,但是,實際應用中總有粗心的小伙伴,參數會出錯。小問題,debug嘛,本來生活就在寫bug和改bug中平淡的度過了,直到他小手一抖把嫦娥一百號送到了火星。python君感覺這樣不行啊,需要幫忙限制一下,只能從‘月球’,‘地球’中選一個,沒有‘火星’選項,於是就有了choices選項:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo",type=int,choices=[0,1],help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
# print(type(args.echo))
print(args.echo)

  這樣,你只能從chioces列表中選啦,否則就報錯:

111.py: error: argument -e/--echo: invalid choice: '1' (choose from 0, 1)

8.還有一個比較好玩的操作action=‘count’,從字面就可以理解,就是計數:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-e", "--echo",action="count",help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
print(args.echo)
-----------------------------------------------------------
python 111.py -e    
結果:1
python 111.py -eee
結果:3

  看懂了嗎?就是count你輸入了幾個e

9.我運行一段代碼,大多數情況下參數都是一樣的,每次都要敲,好煩。python君也想到了呢,default,比如:

parser.add_argument("-v", "--verbosity", action="count", default=0)
這樣,你就給了這個參數默認值0了,以后在輸入時可以跳過這個參數了。

 10.最后一個知識點,互斥組,就是傳參多個bool型變量,只有一個為真,直接上例子吧:

 

import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("-e", "--echo",action="count",help="這是一段備注,防止自己的代碼自己不認識")
args = parser.parse_args()
print(args.echo)

  如果你兩個互斥變量都為真  python 111.py -q -v -e

就會報錯:  111.py: error: argument -v/--verbose: not allowed with argument -q/--quiet

 在if elif選項中來傳參很好用喲。

11.有時,需要向程序中傳入一個list,args也是可以實現的(參考https://blog.csdn.net/kinggang2017/article/details/94036386

parser.add_argument("-g", "--gpu_list", type=int, nargs='+', default=[0, 1, 2, 3],

  運行時,python 111.py -g 1 2 3來指定列表值,注意,1 2 3之間用space分割。這樣能傳入int型列表,其他類型的列表可以參考上面的連接

這次就分享這么多,有什么遺漏的歡迎大家補充。

 


免責聲明!

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



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