繁体   English   中英

理解用Python中的argparse解析参数

[英]Understanding argument parsing with argparse in Python

我现在开始探索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)

它给你5因为sys.argv包含作为参数传递给python的原始输入(脚本名称和4个参数)。

你可以看到argparse作为它的抽象,所以一旦你使用它,你就可以忘记sys.argv 在大多数情况下,最好不要将这两种方法混合使用。

argparse是一个很好的处理参数的方法,我不太明白为什么你不想使用required选项,而这正是要走的路。 另一种方法是自己解析sys.argv (可能是正则表达式?)并完全删除argparse

有一个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)

解析器返回一个对象(类型为argparse.Namespace ),该对象具有由参数定义的属性。 通常使用args.inputargs.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")

如果需要inputoutput ,我可以将它们更改为:

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")

现在inputoutput是位置参数,如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.requireda2.required也可能是a2.required ,它们分别是False和True。 required是一个不常规显示的Action属性,但从不那么容易访问。

我从交互式shell( Ipython )中定义的解析器中提取了所有这些测试值。 这是探索Python和argparse等模块的好方法。

阅读其他相关帖子之后,似乎最好的方法就是@Rufflewind建议并检查args本身:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM