参数不在选项后面时python getopt模块引发错误
我有一段代码来处理命令行参数参数不在选项后面时python getopt模块引发错误,python,command-line-arguments,getopt,Python,Command Line Arguments,Getopt,我有一段代码来处理命令行参数 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 '
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
如果我输入的命令不带选项符号“-”如下所示:
python parse_flv.py s
这会引起一个错误
我的问题:
如何使用getopt模块处理没有类'-i'选项的参数。谢谢你应该考虑使用模块。code>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')
有关getopt
和argparse
的更多详细信息(相互比较)
编辑: 以下是使用
getopt
(据我所知)所能做到的最好方法,即使用GNU getopt
切换到GNU模式
:
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
或
产出:
ARGV : ['-o', 'output', 'input']
OPTIONS : [('-o', 'output')]
OUTPUTNAME : output
REMAINING : ['input']
INPUTNAME : input
这将确认您必须自己处理剩余的列表
但是,至少,您可以切换这两个选项的顺序
有趣的来源。在您的代码中,参数s
位于从getopt.getopt()
返回的列表args
中。令人担忧的是,您在两个地方打印了用法消息,并且消息不同(两者都不完整,因为它们都没有提到-h
或-d
)。请为作业使用函数(然后也可以写入标准错误,而不是标准输出)。您的代码似乎没有强制执行强制性的-i
选项。
ARGV : ['-o', 'output', 'input']
OPTIONS : [('-o', 'output')]
OUTPUTNAME : output
REMAINING : ['input']
INPUTNAME : input