理解在 Python 中使用 argparse 进行参数解析
Understanding argument parsing with argparse in Python
我现在开始探索 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)
运行这个脚本:
> ./test-args.py -i a -o b
打印:
5
Correct number of params: 5
我理解 if 条件中的打印语句(5 大于 2),但是,在阅读了 argparse 文档后(https://docs.python.org/3/library/argparse.html)我仍然不太明白为什么 -i 和 -o 标志被算作参数。这种行为似乎与例如完全不同perl Getopt::Std,我比较习惯。
所以,问题是在 Python 中解析参数和评估强制参数的存在(不使用 required=True)的最佳方法是什么
它给你 5,因为 sys.argv
包含作为参数传递给 python 的原始输入(脚本名称和 4 个参数)。
你可以把argparse
看作是对此的抽象,所以一旦你使用它,你就可以忘记sys.argv
。在大多数情况下,最好不要混合使用这两种方法。
argparse
它是处理参数的好方法,我不太明白为什么你不想使用 required
选项,而这恰恰是正确的方式。另一种选择是自己解析 sys.argv
(可能是正则表达式?)并完全删除 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 版本)。
https://docs.python.org/2/library/getopt.html
在您的代码中,sys.argv
是来自命令行的字符串列表(由 shell 和解释器解释)。它是任何解析器('getopt'、'optparse'、'argparse')的原始输入。它也可用于您的解析。学习时最好包含一个
print sys.argv
行。 parser.parse_args()
使用此列表。 sys.argv[0]
用作 prog
属性(在默认用法中),而 sys.argv[1:]
(其余)根据您使用 add_argument
定义的规则进行解析。为了进行测试,我经常喜欢将 parse_args
与自定义字符串列表一起使用,例如
print parser.parse_args(['-i', 'input', '-o', 'output', '-u'])
根据您的定义,我希望看到如下内容:
Namespace(input='input', output='output', isunfolded=True)
解析器 returns 一个对象(类型 argparse.Namespace
),它具有由您的参数定义的属性。通常使用 args.input
、args.isunfolded
等表达式访问值。文档还展示了如何轻松地将其表达为字典。
根据长期存在的 UNIX 约定,由诸如“-i”之类的字符串标记的参数是选项,也就是说它们是可选的。 argparse
通过让您指定 required=True
参数来概括此概念。
其他参数是位置参数。它们根据它们的顺序被解释。因此,它们通常是必需的。 argparse
添加的是定义这些位置的能力,例如类型、nargs 等。使用 nargs='?'
它们是可选的。许多 nargs
值类似于正则表达式字符(例如 +?*)。事实上 argparse
使用正则表达式解析的形式在参数之间分配字符串。
我会这样完善你的论点(利用各种默认值)
a1 = parser.add_argument("-i", "--input", help="input file") # 'store' is the default
a2 = parser.add_argument("-o", "--output",help="output file") # use the --output as dest
a3 = parser.add_argument("-u", "--isunfolded", action="store_true", help="optional flag")
如果需要 input
和 output
,我可以将它们更改为:
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
是一个 _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.required
和 a2.required
也可能有指导意义,它们分别是 False 和 True。 required
是一个 Action
属性,它不会经常显示,但始终可访问。
我已经从交互式 shell (Ipython
) 中定义的解析器中提取了所有这些测试值。这是探索 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)
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)
运行这个脚本:
> ./test-args.py -i a -o b
打印:
5
Correct number of params: 5
我理解 if 条件中的打印语句(5 大于 2),但是,在阅读了 argparse 文档后(https://docs.python.org/3/library/argparse.html)我仍然不太明白为什么 -i 和 -o 标志被算作参数。这种行为似乎与例如完全不同perl Getopt::Std,我比较习惯。
所以,问题是在 Python 中解析参数和评估强制参数的存在(不使用 required=True)的最佳方法是什么
它给你 5,因为 sys.argv
包含作为参数传递给 python 的原始输入(脚本名称和 4 个参数)。
你可以把argparse
看作是对此的抽象,所以一旦你使用它,你就可以忘记sys.argv
。在大多数情况下,最好不要混合使用这两种方法。
argparse
它是处理参数的好方法,我不太明白为什么你不想使用 required
选项,而这恰恰是正确的方式。另一种选择是自己解析 sys.argv
(可能是正则表达式?)并完全删除 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 版本)。
https://docs.python.org/2/library/getopt.html
在您的代码中,sys.argv
是来自命令行的字符串列表(由 shell 和解释器解释)。它是任何解析器('getopt'、'optparse'、'argparse')的原始输入。它也可用于您的解析。学习时最好包含一个
print sys.argv
行。 parser.parse_args()
使用此列表。 sys.argv[0]
用作 prog
属性(在默认用法中),而 sys.argv[1:]
(其余)根据您使用 add_argument
定义的规则进行解析。为了进行测试,我经常喜欢将 parse_args
与自定义字符串列表一起使用,例如
print parser.parse_args(['-i', 'input', '-o', 'output', '-u'])
根据您的定义,我希望看到如下内容:
Namespace(input='input', output='output', isunfolded=True)
解析器 returns 一个对象(类型 argparse.Namespace
),它具有由您的参数定义的属性。通常使用 args.input
、args.isunfolded
等表达式访问值。文档还展示了如何轻松地将其表达为字典。
根据长期存在的 UNIX 约定,由诸如“-i”之类的字符串标记的参数是选项,也就是说它们是可选的。 argparse
通过让您指定 required=True
参数来概括此概念。
其他参数是位置参数。它们根据它们的顺序被解释。因此,它们通常是必需的。 argparse
添加的是定义这些位置的能力,例如类型、nargs 等。使用 nargs='?'
它们是可选的。许多 nargs
值类似于正则表达式字符(例如 +?*)。事实上 argparse
使用正则表达式解析的形式在参数之间分配字符串。
我会这样完善你的论点(利用各种默认值)
a1 = parser.add_argument("-i", "--input", help="input file") # 'store' is the default
a2 = parser.add_argument("-o", "--output",help="output file") # use the --output as dest
a3 = parser.add_argument("-u", "--isunfolded", action="store_true", help="optional flag")
如果需要 input
和 output
,我可以将它们更改为:
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
是一个 _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.required
和 a2.required
也可能有指导意义,它们分别是 False 和 True。 required
是一个 Action
属性,它不会经常显示,但始终可访问。
我已经从交互式 shell (Ipython
) 中定义的解析器中提取了所有这些测试值。这是探索 Python 和 argparse
.