Python Getopt单字符与长命令行参数解析行为差异及修复
修复Python getopt解析短选项与长选项行为不一致问题
原代码
import getopt import sys print("Let's read the arguments from command line") user_inputs = sys.argv[1:] print(user_inputs) # get option and value pair from getopt try: opts, args = getopt.getopt(user_inputs, "fh:", ["findings=", "help"]) #lets's check out how getopt parse the arguments print(opts) print(args) except getopt.GetoptError: print('pass the arguments like -f <findings JSON file> -h <help> or --findings <findings JSON file> and --help <help>') sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): print('pass the arguments like -f <findings JSON file> -h <help> or --findings <findings JSON file> and --help <help>') sys.exit() elif opt in ("-f", "--findings"): # do something with the input file else: print('pass the arguments like -f <findings JSON file> -h <help> or --findings <findings JSON file> and --help <help>') sys.exit()
问题现象
使用短选项运行时:
% python3 py_args_options.py -f 'findings.json' Let's read the arguments from command line ['-f', 'findings.json'] [('-f', '')] ['findings.json']
此时opts为[('-f', '')],args为['findings.json'],参数未被正确绑定到-f选项。
使用长选项运行时:
python3 py_args_options.py --findings 'findings.json' Let's read the arguments from command line ['--findings', 'findings.json'] [('--findings', 'findings.json')] []
此时opts为[('--findings', 'findings.json')],args为空数组,参数正确绑定到选项。
修复方案
问题出在短选项的定义上:你给短选项字符串写的是"fh:",其中h:表示-h需要参数,但**f后面没有加冒号**,导致getopt认为-f不需要参数,所以不会把后续的findings.json绑定到它上面,而是放到args里。
只需要修改短选项字符串,给f后面加上冒号,表明它需要接收参数:
# 将 "fh:" 修改为 "f:h:" opts, args = getopt.getopt(user_inputs, "f:h:", ["findings=", "help"])
修改后测试短选项,结果就和长选项一致了:
% python3 py_args_options.py -f 'findings.json' Let's read the arguments from command line ['-f', 'findings.json'] [('-f', 'findings.json')] []
补充说明
- 在
getopt的短选项字符串中,冒号:表示该选项需要参数,::表示参数可选。 - 长选项列表中,
"findings="的等号=同样表示该选项需要参数,和短选项的冒号作用对应。
内容的提问来源于stack exchange,提问作者nnay84
相关产品推荐
相关产品推荐

