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

Posted

技术标签:

【中文标题】python getopt模块在参数不在选项后面时引发错误【英文标题】:python getopt module raise error when argument is not behind an option 【发布时间】:2013-06-24 20:32:00 【问题描述】:

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

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

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

 python parse_flv.py s

这会引发错误。

我的问题

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

【问题讨论】:

令人担忧的是,您在两个地方打印了使用消息并且消息不同(并且两者都不完整,因为都没有提到-h-d)。请为工作使用一个函数(然后你也可以写入标准错误而不是标准输出)。您的代码似乎没有强制执行-i 选项。 【参考方案1】:

您应该考虑改用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')

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

parser.add_argument('outfile', nargs='?', help='output file name', default='out.txt')

有关getoptargparse here 的更多详细信息(相互比较)。


编辑:

这是使用getopt 可以做的最好的事情(据我所知),即使用gnu_getopt 切换到GNU mode

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

调用:

python parse_flv.py input -o output

python parse_flv.py -o output input

输出:

ARGV      : ['-o', 'output', 'input']
OPTIONS   : [('-o', 'output')]
OUTPUTNAME  : output
REMAINING   : ['input']
INPUTNAME   : input

这将确认您必须自己处理remaining 列表...

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

有趣的来源here。

【讨论】:

【参考方案2】:

在您的代码中,参数sgetopt.getopt() 返回的列表args 中。

【讨论】:

以上是关于python getopt模块在参数不在选项后面时引发错误的主要内容,如果未能解决你的问题,请参考以下文章

Python中getopt()函数的使用

Python中getopt()函数的使用

python之getopt

getopt-解析命令行参数

Python 命令行参数和getopt模块详解

Perl模块 Getopt::Long 解析