在Python中使用argparse理解参数解析

在Python中使用argparse理解参数解析,python,argparse,Python,Argparse,我现在开始探索Python,并测试如何使用“argparse”将参数传递给脚本。 我编写示例脚本的方式如下所示,其中通过标志-I和-o传递的参数是必需的,标志-u是可选的: #!/usr/bin/python import sys import argparse ## set usage options and define arguments usage = "usage: %prog [options]" parser = argparse.ArgumentParser(usage)

我现在开始探索Python,并测试如何使用“argparse”将参数传递给脚本。 我编写示例脚本的方式如下所示,其中通过标志-I和-o传递的参数是必需的,标志-u是可选的:

#!/usr/bin/python

import sys
import argparse

## set usage options and define arguments
usage = "usage: %prog [options]"
parser = argparse.ArgumentParser(usage)

parser.add_argument("-i",  action="store", dest="input", help="input file")
parser.add_argument("-o",  action="store", dest="output", help="output file")
parser.add_argument("-u", action="store_true", dest="isunfolded", default=False, help="optional flag")

args = parser.parse_args()

print len(sys.argv)  
if len(sys.argv) < 2:
#        parser.print_help()   
        print 'Incorrect number of params'
        exit()
else:
        print "Correct number of params: ", len(sys.argv)
印刷品:

5
Correct number of params:  5
我理解if条件中的printing语句(5大于2),但是,在阅读argparse文档()之后,我仍然不太理解为什么将-I和-o标志计算为参数。这种行为似乎与我比较习惯的perl Getopt::Std完全不同


因此,问题是在Python中解析参数和评估强制参数(不使用required=True)的最佳方式是什么?它给出了5,因为
sys.argv
包含作为参数传递给Python的原始输入(脚本名称和4个参数)

您可以将
argparse
视为这方面的抽象,因此一旦使用它,您就可以忘记
sys.argv
。在大多数情况下,最好不要将这两种方法混合使用


argparse
这是处理参数的好方法,我不太明白为什么你不想使用
required
选项。另一种选择是自己解析
sys.argv
(可能是regex?)并完全删除
argparse

阅读其他相关文章后,最好的方法似乎是按照@Rufflewind的建议,检查args本身:

if not args.input or not args.output:
        print 'Incorrect number of params'
        exit()
else:
        print "Correct number of params"

有一个Python
getopt
,它可能类似于Perl(假设两者都是按照C/Unix版本建模的)

在代码中,
sys.argv
是命令行中的字符串列表(由shell和解释器解释)。它是任何解析器的原始输入(“getopt”、“optparse”、“argparse”)。它也可用于您的解析。在学习时,最好包括

print sys.argv
线路<代码>解析器。parse_args()使用此列表
sys.argv[0]
用作
prog
属性(默认用法),而
sys.argv[1://code>(其余部分)则根据您使用
add\u参数定义的规则进行解析。对于测试,我经常喜欢使用
parse_args
和自定义字符串列表,例如

print parser.parse_args(['-i', 'input', '-o', 'output', '-u'])
根据您的定义,我希望看到如下内容:

Namespace(input='input', output='output', isunfolded=True)
解析器返回一个对象(类型
argparse.Namespace
),该对象具有由参数定义的属性。值通常通过以下表达式进行访问:
args.input
args.isunfolded
。这些文档还展示了如何轻松地将其表示为字典

根据长期存在的UNIX约定,由'-i'等字符串标记的参数是选项,也就是说,它们是可选的
argparse
通过允许您指定
required=True
参数来概括此概念

其他参数是位置。它们是按顺序解释的。因此,它们通常是必需的。
argparse
添加的是定义这些位置的能力,例如type、nargs等。使用
nargs='?'
它们是可选的。许多
narg
值类似于正则表达式字符(例如+?*)。实际上,
argparse
使用正则表达式解析的形式在参数之间分配字符串


因此,我将改进您的论点(利用各种默认值)

如果需要
输入
输出
,我可以将它们更改为:

parser.add_argument("input", help="input file")  # 'store' is the default
parser.add_argument("output",help="output file") # use the --output as dest
parser.add_argument("-u", "--isunfolded",  action="store_true", help="optional flag")
现在
input
output
是位置参数,如
test.py-u inputfile outputfile

通过使用
a1=parser…
我可以查看此语句生成的对象

print a1
产生

_StoreAction(option_strings=['-i', '--input'], dest='input', nargs=None, const=None,
    default=None, type=None, choices=None, help='input file', metavar=None)
这告诉我
a1
\u StoreAction
对象(是
argparse.Action
的子类)。它还显示许多(不是全部)属性,这些属性定义了它的操作。另一方面,位置变量具有如下值:

a2 = p.add_argument("output", help="output file")
_StoreAction(option_strings=[], dest='output', nargs=None, const=None, 
    default=None, type=None, choices=None, help='output file', metavar=None)
查看
a1.必需的
a2.必需的
,也可能会有所启发,它们分别为假和真
required
是一个
操作
属性,它不是常规显示的,但从来都是不可访问的


我从交互式shell(
Ipython
)中定义的解析器中提取了所有这些测试值。这是一种探索Python和模块(如
argparse
)的好方法。您应该打印len(args),而不是len(sys.argv)。为什么不使用
required=True
?另外,
sys.argv
包含未分析的参数列表,即
[“/test args.py”、“-i”、“a”、“-o”、“-b”]
。如果需要解析的参数,应检查
args.input
args.output
,以及
args.isunfolded
。解析参数后,它们不再以列表的形式出现(位置参数除外),因此询问“参数数量”是没有意义的。@Rufflewind是的,我知道检查args.input、args.output和args.isunfold是最好的方法,但由于我还在学习Python,我想了解这些简单的形式。@Ashalynd“print len(args)”产生以下错误:“TypeError:Namespace类型的对象没有len()
_StoreAction(option_strings=['-i', '--input'], dest='input', nargs=None, const=None,
    default=None, type=None, choices=None, help='input file', metavar=None)
a2 = p.add_argument("output", help="output file")
_StoreAction(option_strings=[], dest='output', nargs=None, const=None, 
    default=None, type=None, choices=None, help='output file', metavar=None)