python的argparse总是感觉太复杂、不够简洁。还是怀念perl的Getopt::Long
,返回一个简单的哈希数组足以。
常见的参数格式
常见的参数格式有以下几种:
-xxx '-'开头,只有关键字,不带值
-xxx=abc '-'开头,key-value对
+xxx=abc '+'开头
-xxx abc '-'开头,等于号用空格带替
xxx 不带特殊前缀
--xxx[=abc] 双'-'开头
一般自己写的脚本里并不需要这么杂,规定前两种也够用了。比如,-verdi表示打开verdi,-lst=rtl.flist表示rtl的文件列表等。
python里的sys.argv
其实python的sys.argv已经帮我们拿到了命令行参数。sys.argv是一个列表,按照输入顺序,用空格切分,依次存储各参数。例如,
运行结果:
$ python test.py -verdi -lst=rtl.flist]
['test.py', '-verdi', '-lst=rtl.flist]']
列表第0个是当前的程序(脚本)名,后面依次是输入的参数。
最简单的参数parser
用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是还很方便的。
把参数处理的函数单独写成module
考虑到可复用性,我们把上面的脚本写到单独的文件里,比如argopt.py里。并且把处理的结果存储到一个dict变量里,因为dict的key-value跟“参数-值”一致。另外dict在处理key-value对时有一些现成的函数。
import sys
import re
args = {}
argplus = []
argspec = {}
def arg_options(*spec):
def arg_help():
def arg_check():
def arg_verbose():
if __name__ == '__main__':
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']
来引用参数的值。