我有一段代码来处理命令行参数。
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'之类选项的参数。感谢
答案 0 :(得分: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')
在此示例中,outfile
是可选的,您可以指定默认输出文件名:
parser.add_argument('outfile', nargs='?', help='output file name', default='out.txt')
有关getopt
和argparse
here的详细信息(相互比较)。
编辑:
以下是使用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
通话:
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。
答案 1 :(得分:1)
在您的代码中,参数s
位于args
返回的getopt.getopt()
列表中。