Python使用getopt解析命令行参数异常:opts为空列表求助
问题:getopt解析命令行参数时opts为空列表,args包含所有参数
代码实现
import sys import getopt import time from datetime import timedelta start_time = time.monotonic() filename = '' startIndex = 1 debug = False outputFile = 'output.csv' try: opts, args = getopt.getopt(sys.argv[1:], "hc:o:", ["help","counter=", "output="]) except getopt.GetoptError as err: # print help information and exit: print(err) # will print something like "option -a not recognized" sys.exit(2) for opt, arg in opts: if opt == '-h': print ('help info') sys.exit() elif opt in ("-o", "--output"): outputfile = arg elif opt in ("-c", "--counter"): startIndex = arg filename = sys.argv[1] print(outputFile) print(startIndex) print(debug) print(opts) print(args)
执行命令
python pSRA.py rs.txt -o out.csv -c 3
输出结果
output.csv 1 False [] ['rs.txt', '-o', 'out.csv', '-c', '3']
错误原因
getopt.getopt()的默认解析规则是:遇到第一个非选项参数(不带-或--的参数)时,就停止解析后续的选项。你把非选项参数rs.txt放在了所有选项的前面,导致getopt直接跳过了后面的-o和-c,把所有内容都当成非选项参数放进了args,opts自然为空。
解决方法
有两种可行的修复方式:
方式1:调整命令参数顺序
把非选项参数放在所有选项的后面,让getopt先解析完所有选项再处理非选项参数:
python pSRA.py -o out.csv -c 3 rs.txt
方式2:使用gnu风格的解析函数
如果需要支持选项和非选项参数混合排列,可以改用getopt.gnu_getopt(),它会扫描所有参数,不管非选项参数的位置:
# 替换原来的getopt.getopt调用 opts, args = getopt.gnu_getopt(sys.argv[1:], "hc:o:", ["help","counter=", "output="])
额外的代码问题修正
除了核心的解析问题,你的代码还有两个小问题:
- 变量名大小写不一致:定义的是
outputFile,赋值时写成了outputfile,导致最终打印的还是默认值output.csv,需要统一变量名。 startIndex被赋值为字符串类型的"3",但初始值是整数1,建议转成整数:startIndex = int(arg)。
修正后的核心循环部分示例:
for opt, arg in opts: if opt == '-h': print ('help info') sys.exit() elif opt in ("-o", "--output"): outputFile = arg # 统一变量名大小写 elif opt in ("-c", "--counter"): startIndex = int(arg) # 转换为整数类型 # 从args中获取filename,而不是直接取sys.argv[1] if args: filename = args[0]
内容的提问来源于stack exchange,提问作者user426132
相关产品推荐
相关产品推荐

