python的argparse总是感觉太复杂、不够简洁。还是怀念perl的Getopt::Long
,返回一个简单的哈希数组足以。
常见的参数格式有以下几种:
一般自己写的脚本里并不需要这么杂,规定前两种也够用了。比如,-verdi表示打开verdi,-lst=rtl.flist表示rtl的文件列表等。
其实python的sys.argv已经帮我们拿到了命令行参数。sys.argv是一个列表,按照输入顺序,用空格切分,依次存储各参数。例如,
# test.py
import
print(sys.argv)
运行结果:
$ python test.py -verdi -lst=rtl.flist]
['test.py', '-verdi', '-lst=rtl.flist]']
列表第0个是当前的程序(脚本)名,后面依次是输入的参数。
用for循环遍历sys.argv,调用处理函数或者设置全局变量。
import sys
import re
for arg in sys.argv:
if arg.startswith('-'):
if re.search(r'^-(\w+)=\(w+)$'):
# ...
elif re.search(r'^-(\w+)$'):
# ...
当脚本很小,且参数个数只有1~3个时,直接在脚本里判断和处理sys.argv是还很方便的。
考虑到可复用性,我们把上面的脚本写到单独的文件里,比如argopt.py里。并且把处理的结果存储到一个dict变量里,因为dict的key-value跟“参数-值”一致。另外dict在处理key-value对时有一些现成的函数。
import sys
import re
# store -option or --option
args = {}
# store +option
argplus = []
# store argument spec
argspec = {}
# parse sys.argv by spec and store into dict
def arg_options(*spec):
# ...
def arg_help():
# ...
def arg_check():
# ...
def arg_verbose():
# ...
if __name__ == '__main__':
#example
arg_options('-h', '-dump', '-verdi', '-lst=s', '-clean', '-seed=s', '-tc=s')
arg_check()
arg_verbose()
if "h" in args:
arg_help()
sys.exit()
filename = "file.flist"
if "lst" in args:
filename = args['lst']
if "tc" in args:
tc = "tc/" + args['tc'] + '.sv'
在使用时,使用for 'key' in args
判断参数是否存在,使用args['key']
来引用参数的值。
完整代码下载链接: argopt.py