我现在开始探索Python,并且正在测试如何使用“argparse”将参数传递给脚本。 我编写示例脚本的方式如下,其中通过flags -i和-o传递的参数是强制的,而flag -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)
答案 0 :(得分:2)
它给你5因为sys.argv
包含作为参数传递给python的原始输入(脚本名称和4个参数)。
您可以将argparse
视为此抽象,因此一旦使用它,您就会忘记sys.argv
。在大多数情况下,最好不要将这两种方法混合使用。
argparse
这是处理参数的一种很好的方法,我不太明白为什么你不想使用required
选项,而这正是要走的路。另一种方法是自己解析sys.argv
(可能是正则表达式?)并完全删除argparse
。
答案 1 :(得分:1)
Python getopt
可能类似于Perl(假设两者都是在C / Unix版本之后建模的)。
https://docs.python.org/2/library/getopt.html
在您的代码中,sys.argv
是命令行中的字符串列表(由shell和解释器解释)。它是任何解析器的原始输入(&#39; getopt&#39;,&#39; optparse&#39;,&#39; argparse&#39;)。它也可用于解析。学习时最好包含一个
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)
解析器返回一个对象(类型argparse.Namespace
),该对象具有由参数定义的属性。通常使用args.input
,args.isunfolded
等表达式访问值。文档还显示了如何轻松地将其表达为字典。
通过长期的UNIX约定,参数由&#39; -i&#39;等字符串标记。是选项,即它们是可选的。 argparse
通过让您指定required=True
参数来概括此概念。
其他论据是定位。他们根据他们的顺序解释。因此通常需要它们。 argparse
添加的是定义这些定位的能力,例如类型,标志等。使用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
等模块的好方法。
答案 2 :(得分:0)
在阅读其他相关帖子之后,似乎最好的方法是按照@Rufflewind的建议并检查args本身:
if not args.input or not args.output:
print 'Incorrect number of params'
exit()
else:
print "Correct number of params"