当参数不在选项后面时,python getopt模块引发错误

Huo*_*Huo 4 python getopt command-line-arguments

我有一段代码来处理命令行参数.

def parse_cmd_args():
    input_path = None
    output_name = 'out.flv.txt'
    is_detail = False
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hi:o:d")
    except getopt.GetoptError:
        print 'Usage:'
        print 'parse_flv -i input_path -o [output_name]'
        sys.exit()
    for op, value in opts:
        if op == '-i':
            input_path = value
        elif op == '-o':
            output_name = value
        elif op == '-d':
            is_detail = True
        elif op == '-h':
            print 'Usage:'
            print 'parse_flv -i input_path [-o output_name]'
            sys.exit()
    return os.path.abspath(input_path), output_name, is_detail
Run Code Online (Sandbox Code Playgroud)

如果我输入这样的命令without a option symbol '-':

 python parse_flv.py s
Run Code Online (Sandbox Code Playgroud)

它会引发错误.

我的问题:

如何使用getopt模块处理没有'-i'之类的选项的参数.谢谢

Gau*_*lio 5

您应该考虑使用argparse模块.getopt有点受限......

这个模块更方便(代码更少,信息量更多,帮助和错误消息更多).在你的情况下,这将简单地类似于:

parser = argparse.ArgumentParser(add_help=True)
parser.add_argument('infile', nargs=1, help='input file name')
parser.add_argument('outfile', nargs='?', help='output file name')
Run Code Online (Sandbox Code Playgroud)

在此示例中,outfile将是可选的,您可以指定默认输出文件名:

parser.add_argument('outfile', nargs='?', help='output file name', default='out.txt')
Run Code Online (Sandbox Code Playgroud)

关于这两者getoptargparse 这里的更多细节(相互比较).


编辑:

这是最好的getopt(据我所知),即切换到GNU mode使用gnu_getopt:

import getopt
import sys

output_name = 'out.txt'
input_name = ''

print 'ARGV      :', sys.argv[1:]

options, remainder = getopt.gnu_getopt(sys.argv[1:], 'o:', ['input-path',
                                                           'output-name=',
                                                          ])
print 'OPTIONS   :', options

for opt, arg in options:
    if opt in ('-o', '--output-name'):
        output_name = arg
    else: 
        pass

# Get input name by yourself...
input_name = remainder[0]

print 'OUTPUTNAME  :', output_name
print 'REMAINING   :', remainder
print 'INPUTNAME   :', input_name
Run Code Online (Sandbox Code Playgroud)

呼叫:

python parse_flv.py input -o output
Run Code Online (Sandbox Code Playgroud)

要么

python parse_flv.py -o output input
Run Code Online (Sandbox Code Playgroud)

输出:

ARGV      : ['-o', 'output', 'input']
OPTIONS   : [('-o', 'output')]
OUTPUTNAME  : output
REMAINING   : ['input']
INPUTNAME   : input
Run Code Online (Sandbox Code Playgroud)

这将证实你必须自己处理remaining清单......

但是,至少,您可以切换两个选项的顺序.

有趣的来源在这里.