利用argparse模塊實作腳本命令列引數決議
By:授客 QQ:1033553122
#代碼實踐1
study.py內容如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
import argparse
def argparseFunc():
'''
基于argparse模塊實作命令引數決議功能
執行示例:
python study.py -i 172.19.7.236 -p 8080 -a -r
python study.py --ip 172.19.7.236 --port 7077 --auth -w -v True
'''
parser = argparse.ArgumentParser(description="study.py usage help document")
# 添加不帶默認值的可決議引數
parser.add_argument("-i", "--ip", help="ip addr") #注意: -h、--help為內置引數,不可用
parser.add_argument("-p", "--port",help="host port")
# 添加帶默認值的可決議引數(# action = store_true 表示是如果使用了這個引數,則值引數值設定為True # 更多action配置可參考原始碼
# 需要注意的是,不能為帶默認值引數指定引數值,會報錯,該引數值會被當作不識別的引數
parser.add_argument("-a", "--auth", help="if auth need", action="store_true")
# 添加互斥引數(比如 例中的-r和-w 同時只能用一個)
exclusive_group = parser.add_mutually_exclusive_group()
exclusive_group.add_argument("-r","--read", help="read enabled" , action="store_true")
exclusive_group.add_argument("-w","--write", help="write enabled", action="store_true")
# 添加引數時不設定設定引數說明
parser.add_argument('-v') # show verbose
# 添加引數時不設定引數全名
parser.add_argument('-V', help="version")
ARGS = parser.parse_args() # 獲取命令列引數
print('ARGS:', ARGS)
# 獲取某個引數值
if ARGS.ip: # 注意,這里的引數名,必須使用引數全稱
print("host addr is: %s" % ARGS.ip)
if ARGS.port:
print("host port is: : %s" % ARGS.port)
if ARGS.auth:
print("auth need: : %s" % ARGS.auth)
if ARGS.read:
print("read enabled: %s" % ARGS.read)
if ARGS.write:
print("write enabled: %s" % ARGS.write)
argparseFunc()
運行測驗
python study.py -i 172.19.7.236 -p 8080 -a -r python study.py --ip 172.19.7.236 --port 7077 --auth -w -v True
結果如下

python study.py -i127.0.0.1 # 注意,引數和引數值之間可以沒有空格
結果如下

python study.py -notExists 1
結果如下

如上,以上代碼實作是針對單個模塊腳本,如果要在多個模塊中使用咋辦?解決方法為封裝為類,具體參見“代碼實踐2”
#代碼實踐2
argument_parser.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
'''
@Author : shouke
'''
import argparse
class ArgParser(object):
'''
引數決議器
'''
def __init__(self, none_exclusive_arguments, exclusive_arguments, description=''):
self.parser = argparse.ArgumentParser(description=description)
self.add_none_exclusive_arguments(none_exclusive_arguments)
self.add_exclusive_arguments(exclusive_arguments)
def add_none_exclusive_arguments(self, options:list):
'''
添加常規選項(非互斥選項)
:param options 格式為list型別,形如
[
'"-a", "--all", help="do not ignore entries starting with ."',
'"-b", "--block", help="scale sizes by SIZE before printing them"',
'"-C", "--color", help="colorize the output; WHEN can be 'never', 'auto'"',
'"-flag", help="make flag", action="store_true"', # action="store_true" 表示如果不設定該選項的值,則默認值為true,類似的action="store_false" 表示默認值為false
]
其中,每個list元素為argparse.ArgumentParserlei add_argument類函式實參的字串表示,add_argument函式定義add_argument(self, *args,**kwargs)
'''
for option in options:
eval('self.parser.add_argument(%s)' % option)
def add_exclusive_arguments(self, options:list):
'''
添加互斥選項
:param options 格式為list,形如以下
[
('"-r","--read",help="Read Action",action="store_true"',
'"-w","--write",help="Write Action",action="store_true"')
]
'''
for option_tuple in options:
exptypegroup = self.parser.add_mutually_exclusive_group()
for item in option_tuple:
eval('exptypegroup.add_argument(%s)' % item)
@property
def args(self):
return self.parser.parse_args()
在xxx.py中參考(注意:為了讓引數決議器起到應起的作用,建議在腳本最上方構造引數決議器物件)
study.py內容如下
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
from argument_parser import ArgParser
none_exclusive_arguments = [
'"-ip", help="自動化測驗服務平臺地址"',
'"-projectId", help="自動化測驗專案id"',
'"-runEnv", help="自動化測驗專案運行環境"',
'"-logLevel", help="日志級別"',
'"-masterHost", help="master服務地址"',
'"-masterPort", help="master服務埠"'
]
exclusive_arguments = [
('"-r", "--read", help="Read Action",action="store_true"',
'"-w", "--write", help="Write Action",action="store_true"')
]
args = ArgParser(none_exclusive_arguments, exclusive_arguments).args
print(args)
print(args.ip)
print(args.read)
運行測驗
python study.py -i 127.0.0.1 -r
運行結果如下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/241222.html
標籤:Python
上一篇:06-運算子
下一篇:09-if判斷
