[英]Python argparse: How to get simple parsing behavior?
有关我们在Python中具有的各种选项和arg解析选择的优点的相关讨论,请参见此处 。
我正在制作一个diff脚本,该脚本与Python的difflib
的输出difflib
,其中涉及的部分是处理可调用它的不同方式。 例如,Git将向您配置它的diff程序发送7个args(第二个和第五个是您要比较的文件),并且大多数差异也希望接受输入作为两个文件args。 有趣的是,git的difftool
的--extcmd=
标志仅使用两个arg调用您指定的差异。
因此,使用OptionParser做到这一点真的很容易,因为它只给您一个args列表,我可以抓取第二个和第五个参数并将它们发送到fileinput
。
我确实注意到pydoc上的大横幅说它已被弃用,所以我在看argparse
。
我根本不清楚是否可以配置argparse
来让您的程序接受一系列位置参数,而无需选择“启动”。 这就是我所需要的,因为我无法更改方式,例如Git会调用差异。
无论如何,我最终对sys.argv
进行了一些琐碎的操作,毕竟,在这种特殊情况下,这是我应该做的。
if len(sys.argv) == 8:
# assume this was passed to git; we can of course do
# some parsing to check if we got valid git style args
args = [sys.argv[2], sys.argv[5]]
elif len(sys.argv) == 3:
args = sys.argv[:1]
else:
sys.exit("Not a valid number of args (2 or 7) to this diff program")
print "Files: " + ' '.join(args)
如何使用argparse来实现一个仅尝试打开并读取其所有参数的程序?
原因是要使argparse
弃用parseopt
,必须能够复制其所有功能(在合理范围内)。
只需添加一个在其前面没有破折号的参数即可。
import argparse
parser = argparse.ArgumentParser()
# You can change nargs to '+' for at least one argument
parser.add_argument('positional', nargs=2) # Positionals have no dashes
parser.add_argument('second_positional', nargs=1)
parser.add_arguemnt('--optional', '-o') # Optionals have dashes
args = parser.parse_args()
print args['positional'] # Your first two positional arguments
print args['second_positional'] # Second set
print args['optional'] # An optional argument
我只是制作了一个使用零个或多个位置参数的示例:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', type=str, nargs='*',
help='zero or more positional arguments')
args = parser.parse_args()
print args.arguments
您可以为此定义一个自定义动作 ,尽管它实际上与您自己的后处理args
没什么不同,除非您有许多需要此动作的参数:
import argparse
class TwoOrSeven(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(values) not in (2,7):
raise argparse.ArgumentTypeError('Not a valid number of args (2 or 7)')
try:
values = values[2], values[5]
except IndexError:
values = values[0]
setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument('args', metavar='arg', action=TwoOrSeven, nargs='+',
help='Must be supplied 2 or 7 arguments')
args = parser.parse_args('1 2 3 4 5 6 7'.split())
print(args)
# Namespace(args=('3', '6'))
args = parser.parse_args('1 2'.split())
print(args)
# Namespace(args='1')
args = parser.parse_args('1 2 3 4 5 6'.split())
# argparse.ArgumentTypeError: Not a valid number of args (2 or 7)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.