python 命令行 解析模块 optparse、argparse
- optparse:https://docs.python.org/zh-cn/3/library/optparse.html
- argparse :https://docs.python.org/zh-cn/3/library/argparse.html
3.2 版后已移除?optparse?模塊,并且將不再繼續開發;開發轉至?argparse?模塊進行。
?1、argparse --- 命令行選項、參數和子命令解析器 ?
argparse?模塊可以讓人輕松編寫用戶友好的命令行接口。程序定義它需要的參數,然后?argparse?將弄清如何從?sys.argv?解析出那些參數。?argparse?模塊還會自動生成幫助和使用手冊,并在用戶給程序傳入無效參數時報出錯誤信息
有關 Python 命令行解析更細致的介紹,請參閱?argparse 教程。
簡單示例:
import argparse# 使用 argparse 的第一步是創建一個 ArgumentParser 對象: parser = argparse.ArgumentParser(description='Process some integers.')# 添加參數 parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)' )# 解析參數,ArgumentParser 通過 parse_args() 方法解析參數 # 通常 parse_args() 參數為空時,將自動從 sys.argv 中確定命令行參數。 parser.parse_args() # 從 sys.argv 讀取參數 arg_list = ['--sum', '7', '-1', '42'] parser.parse_args(arg_list)ArgumentParser 對象
class?argparse.ArgumentParser(prog=None,?usage=None,?description=None,?epilog=None,?parents=[],?formatter_class=argparse.HelpFormatter,?prefix_chars='-',?fromfile_prefix_chars=None,?argument_default=None,?conflict_handler='error',?add_help=True,?allow_abbrev=True,?exit_on_error=True)
創建一個新的?ArgumentParser?對象。所有的參數都應當作為關鍵字參數傳入。每個參數在下面都有它更詳細的描述,但簡而言之,它們是:
-
prog?- 程序的名稱(默認值:sys.argv[0])
-
usage?- 描述程序用途的字符串(默認值:從添加到解析器的參數生成)
-
description?- 在參數幫助文檔之前顯示的文本(默認值:無)
-
epilog?- 在參數幫助文檔之后顯示的文本(默認值:無)
-
parents?- 一個?ArgumentParser?對象的列表,它們的參數也應包含在內
-
formatter_class?- 用于自定義幫助文檔輸出格式的類
-
prefix_chars?- 可選參數的前綴字符集合(默認值: '-')
-
fromfile_prefix_chars?- 當需要從文件中讀取其他參數時,用于標識文件名的前綴字符集合(默認值:?None)
-
argument_default?- 參數的全局默認值(默認值:?None)
-
conflict_handler?- 解決沖突選項的策略(通常是不必要的)
-
add_help?- 為解析器添加一個?-h/--help?選項(默認值:?True)
-
allow_abbrev?- 如果縮寫是無歧義的,則允許縮寫長選項 (默認值:True)
-
exit_on_error?- 決定當錯誤發生時是否讓 ArgumentParser 附帶錯誤信息退出。 (默認值:?True)
位置參數
示例代碼:
import argparseparser = argparse.ArgumentParser() parser.add_argument("square", help="display a square of a given number", type=int ) args = parser.parse_args() print(args.square ** 2)運行結果:
$ python3 prog.py 4 16 $ python3 prog.py four usage: prog.py [-h] square prog.py: error: argument square: invalid int value: 'four'可選參數
import argparseparser = argparse.ArgumentParser() parser.add_argument("--verbosity", help="參數verbosity") parser.add_argument("--true_or_false", help="參數true_or_false", action="store_true") args = parser.parse_args()arg_verbosity = args.verbosity print(arg_verbosity) arg_true_or_false = args.true_or_false print(arg_true_or_false)關鍵詞?action?賦值為?"store_true"。這意味著,當這一選項存在時,為?args.verbose?賦值為?True。沒有指定時則隱含地賦值為?False。
短選項
示例代碼:
import argparseparser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", help="increase output verbosity",action="store_true" ) args = parser.parse_args() if args.verbose:print("verbosity turned on")位置參數、可選參數 混合使用
示例代碼:
import argparseparser = argparse.ArgumentParser() parser.add_argument("square", type=int,help="顯示輸入數字的平方和" ) parser.add_argument("-v", "--verbosity", action="count", default=0,help="輸出詳細信息" ) args = parser.parse_args() answer = args.square ** 2 if args.verbosity >= 2:print(f"the square of {args.square} equals {answer}") elif args.verbosity >= 1:print(f"{args.square}^2 == {answer}") else:print(answer)關鍵字?default?用來設置默認參數。默認情況下如果一個可選參數沒有被指定,它的值會是?None,
矛盾的選項( 互斥參數 )
add_mutually_exclusive_group()?允許指定彼此相互沖突的選項。
示例:將引入?--quiet?選項,它將與?--verbose?正好相反:
示例代碼:
import argparseparser = argparse.ArgumentParser(description="簡單計算")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("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") args = parser.parse_args() answer = args.x ** args.yif args.quiet:print(answer) elif args.verbose:print("{} to the power {} equals {}".format(args.x, args.y, answer)) else:print("{}^{} == {}".format(args.x, args.y, answer))2、使用 optparse?處理 命令行參數
Python 有兩個內建的模塊用于處理命令行參數:
起初,argparse?曾經嘗試通過?optparse?來維持兼容性。 但是,optparse?很難透明地擴展,特別是那些為支持新的?nargs=?描述方式和更好的用法消息所需的修改。
optparse 用法
- 首先,必須導入 OptionParser 類,創建一個 OptionParser 對象:
? ? ? ? from optparse import OptionParser
? ? ? ? parser = OptionParser() - 然后,使用 add_option 來定義命令行參數:
? ? ? ? parser.add_option(opt_str, ..., attr=value, ...)
? ? ? ? # 每個命令行參數就是由參數名字符串和參數屬性組成的,
? ? ? ? # 如 -f 或者 –file 分別是長短參數名:parser.add_option("-f", "--file", ...) - 最后,一旦你已經定義好了所有的命令行參數,調用 parse_args() 來解析程序的命令行:?
? ? (options, args) = parser.parse_args()? # 不寫這一句 -h 或?--help 不會打印幫助信息
parse_args() 返回的兩個值:
- options:它是一個對象(optpars.Values),保存有命令行參數值。只要知道命令行參數名,如 user,就可以訪問其對應的值: options.user
- args:返回一個位置參數的列表
action 是 parse_args() 方法的參數之一,它表示當?optparse 解析到一個命令行參數時,將會把參數值保存在 options 對象里。actions 有一組固定的值可供選擇,這里只解釋?三種類型:
store_true 和 store_false 用于處理帶命令行參數后面不帶值的情況。如 -v,-q 等命令行參數:
parser.add_option("-v", action="store_true", dest="verbose") parser.add_option("-q", action="store_false", dest="verbose")這樣的話,當解析到 ‘-v’,options.verbose 將被賦予 True 值,反之,解析到 ‘-q’,會被賦予 False 值。
傳遞一個命令行參數列表
注: 也可以傳遞一個命令行參數列表到 parse_args();否則,默認使用 sys.argv[:1]
from optparse import OptionParserparser = OptionParser() parser.add_option("-f", "--file",action="store", type="string", dest="filename" ) args_list = ["-f", "foo.txt"] # 命令行參數列表 (options, args) = parser.parse_args(args_list) print(options.filename)?
結果打印出 “foo.txt”。當 optparse 解析到 ’-f’ ,會繼續解析后面的 ’foo.txt’,然后將 ’foo.txt’ 保存到 options.filename 里。當調用 parser.args() 后,options.filename 的值就為’foo.txt’。
也可以指定 add_option() 方法中 type 參數為其它值,如 int 或者 float 等:
parser.add_option("-n", type="int", dest="num")
默認 type 為 ’string’。正如上面所示,長參數名也是可選的。其實,dest 參數也是可選的。如果沒有指定 dest 參數,將用命令行的參數名來對 options 對象的值進行存取。
默認值:
parse_args() 方法提供了一個 default 參數用于設置默認值。如:
parser.add_option("-f","--file", action="store", dest="filename", default="foo.txt") parser.add_option("-v", action="store_true", dest="verbose", default=True)又或者使用 set_defaults():
from optparse import OptionParserparser = OptionParser() parser.add_option("-f", "--file", action="store", type="string", dest="filename") parser.add_option("-u", "--user", action="store", type="string", dest="username")parser.set_defaults(filename='test.txt', username='root')# args_list = ["-f", "foo.txt"] # (options, args) = parser.parse_args(args_list) (options, args) = parser.parse_args()print(options.filename) print(options.username)生成程序幫助
optparse 另一個方便的功能是自動生成程序的幫助信息。你只需要為 add_option() 方法的 help 參數指定幫助信息文本:
from optparse import OptionParserusage = "usage: %prog [options] arg1 arg2" parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose",action="store_true", dest="verbose", default=True,help="make lots of noise [default]" ) parser.add_option("-q", "--quiet",action="store_false", dest="verbose",help="be vewwy quiet (I'm hunting wabbits)" ) parser.add_option("-f", "--filename",metavar="FILE", help="write output to FILE" ) parser.add_option("-m", "--mode",default="intermediate",help="interaction mode: novice, intermediate, ""or expert [default: %default]" )(options, args) = parser.parse_args()當 optparse 解析到 -h 或者 –help 命令行參數時,會調用 parser.print_help() 打印程序的幫助信息:
usage: <yourscript> [options] arg1 arg2options:-h, --help ? ? ? ? ? ?show this help message and exit-v, --verbose ? ? ? ? make lots of noise [default]-q, --quiet ? ? ? ? ? be vewwy quiet (I'm hunting wabbits)-f FILE, --filename=FILEwrite output to FILE-m MODE, --mode=MODE ?interaction mode: novice, intermediate, orexpert [default: intermediate]注意: 打印出幫助信息后,optparse 將會退出,不再解析其它的命令行參數
usage = "usage: %prog [options] arg1 arg2"?這行信息會優先打印在程序的選項信息前。其中的 %prog,optparse 會以當前程序名的字符串來替代:如 os.path.basename.(sys.argv[0])。
如果用戶沒有提供自定義的使用方法信息,optparse 會默認使用: “usage: %prog [options]”。
用戶在定義命令行參數的幫助信息時,不用擔心換行帶來的問題,optparse 會處理好這一切。
設置 add_option 方法中的 metavar 參數,有助于提醒用戶,該命令行參數所期待的參數,如 metavar=“mode”:
-m MODE, --mode=MODE注意: metavar 參數中的字符串會自動變為大寫。
在 help 參數的幫助信息里使用 %default 可以插入該命令行參數的默認值。
顯示程序版本
像 usage message 一樣,你可以在創建 OptionParser 對象時,指定其 version 參數,用于顯示當前程序的版本信息:parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")
這樣,optparse 就會自動解釋 –version 命令行參數:$ /usr/bin/foo --version
foo 1.0
命令行參數分組
如果程序有很多的命令行參數,你可能想為他們進行分組,這時可以使用 OptonGroup:
from optparse import OptionParser from optparse import OptionGroupusage = "usage: %prog [options] arg1 arg2" parser = OptionParser(usage=usage)group = OptionGroup(parser,'Dangerous Options','Caution: use these options at your own risk.''It is believed that some of them bite.' ) group.add_option('-g', action='store_true', help='Group option.') parser.add_option_group(group)完整代碼:
from optparse import OptionParser from optparse import OptionGroupusage = "usage: %prog [options] arg1 arg2" parser = OptionParser(usage=usage) parser.add_option("-v", "--verbose",action="store_true", dest="verbose", default=True,help="make lots of noise [default]" ) parser.add_option("-q", "--quiet",action="store_false", dest="verbose",help="be vewwy quiet (I'm hunting wabbits)" ) parser.add_option("-f", "--filename",metavar="FILE", help="write output to FILE" ) parser.add_option("-m", "--mode",default="intermediate",help="interaction mode: novice, intermediate, ""or expert [default: %default]" )group = OptionGroup(parser,'Dangerous Options','Caution: use these options at your own risk.''It is believed that some of them bite.' ) group.add_option('-g', action='store_true', help='Group option.') parser.add_option_group(group)(options, args) = parser.parse_args()下面是將會打印出來的幫助信息:
Usage: opt.py [options] arg1 arg2Options:-h, --help show this help message and exit-v, --verbose make lots of noise [default]-q, --quiet be vewwy quiet (I'm hunting wabbits)-f FILE, --filename=FILEwrite output to FILE-m MODE, --mode=MODE interaction mode: novice, intermediate, or expert[default: intermediate]Dangerous Options:Caution: use these options at your own risk.It is believed that someof them bite.-g Group option.處理異常
包括程序異常和用戶異常。這里主要討論的是用戶異常,是指因用戶輸入無效的、不完整的命令行參數而引發的異常。optparse 可以自動探測并處理一些用戶異常:
$ /usr/bin/foo -n 4x
usage: foo [options]
foo: error: option -n: invalid integer value: '4x'
$ /usr/bin/foo -n
usage: foo [options]
foo: error: -n option requires an argument
用戶也可以使用 parser.error() 方法來自定義部分異常的處理:
(options, args) = parser.parse_args() [...] if options.a and options.b:parser.error("optionsnd -b are mutually exclusive")上面的例子,當 -b 和 -b 命令行參數同時存在時,會打印出“options -a and -b are mutually exclusive“,以警告用戶。
如果以上的異常處理方法還不能滿足要求,你可能需要繼承 OptionParser 類,并重載 exit() 和 erro() 方法。
示例代碼 1:
import optparse# usage 定義的是使用方法,%prog 表示腳本本身,version定義的是腳本名字和版本號 parse = optparse.OptionParser(usage='"usage:%prog [options] arg1,arg2"', version="%prog 1.2") parse.add_option('-u', '--user', dest='user', action='store', type=str, metavar='user', help='Enter User Name!!') parse.add_option('-p', '--port', dest='port', type=int, metavar='xxxxx', default=3306, help='Enter Mysql Port!!') parse.add_option('-v', help='Mysql Version!!') # -u,--user 表示一個是短選項 一個是長選項 # dest='user' 將該用戶輸入的參數保存到變量user中,可以通過options.user方式來獲取該值 # type=str,表示這個參數值的類型必須是str字符型,如果是其他類型那么將強制轉換為str(可能會報錯) # metavar='user',當用戶查看幫助信息,如果metavar沒有設值,那么顯示的幫助信息的參數后面默認帶上dest所定義的變量名 # help='Enter..',顯示的幫助提示信息 # default=3306,表示如果參數后面沒有跟值,那么將默認為變量default的值 parse.set_defaults(v=1.2) # 也可以這樣設置默認值options, args = parse.parse_args() print('OPTIONS:', options) print('ARGS:', args) print('~' * 20) print('user:', options.user) print('port:', options.port) print('version:', options.v)運行結果:
?
python zzz.py -uroot -p3306 OPTIONS: {'v': 1.2, 'port': 3306, 'user': 'root'} ARGS: [] ~~~~~~~~~~~~~~~~~~~~ user: root port: 3306 version: 1.2python zzz.py --version zzz.py 1.2示例代碼 2:
from optparse import OptionParserparser = OptionParser() parser.add_option("-f", "--file", dest="filename",help="write report to FILE", metavar="FILE" ) parser.add_option("-q", "--quiet",action="store_false", dest="verbose", default=True,help="don't print status messages to stdout" )(options, args) = parser.parse_args()現在你就可以在命令行下輸入下面命令了:
<yourscript> --file=outfile -q <yourscript> -f outfile --quiet <yourscript> --quiet --file outfile <yourscript> -q -foutfile <yourscript> -qfoutfile上面這些命令是相同效果的。除此之外, optparse 還為我們自動生成命令行的幫助信息:
<yourscript> -h <yourscript> --help輸出:
usage: <yourscript> [options] options: -h, --help show this help message and exit -f FILE, --file=FILE write report to FILE -q, --quiet don't print status messages to stdout示例代碼 3:
from optparse import OptionParserdef main():usage = "usage: %prog [options] arg"parser = OptionParser(usage)parser.add_option("-f", "--file", dest="filename", help="read data from FILENAME")parser.add_option("-v", "--verbose", action="store_true", dest="verbose")parser.add_option("-q", "--quiet", action="store_false", dest="verbose")(options, args) = parser.parse_args()if len(args) != 1:parser.error("incorrect of arguments")if options.verbose:print("reading %s..." % options.filename)if __name__ == "__main__":main() 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python 命令行 解析模块 optparse、argparse的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EasyExcel快速上手~读取
- 下一篇: Java8 Stream详解~排序:so