1

有关我们在 Python 中的各种选项和 arg 解析选择的优点的相关讨论,请参见此处。

我正在制作一个 diff 脚本,它对 Python 的输出做一些简洁的事情,difflib其中​​涉及的部分内容是处理可以调用​​它的不同方式。例如,Git 将发送 7 个参数(第二个和第五个是您想要比较的文件)到您配置它的 diff 程序,并且大多数差异也应该接受作为两个文件参数的输入。有趣的是, git 的difftool标志--extcmd=调用了您仅使用两个参数指定的差异。

所以,使用 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它必须可以复制其所有功能(在合理范围内)。

4

3 回答 3

1

只需添加一个前面没有破折号的参数。

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
于 2013-06-12T20:51:37.267 回答
1

我刚刚做了这个例子,它接受零个或多个位置参数:

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
于 2013-06-12T20:55:15.973 回答
0

您可以为此定义一个自定义操作,尽管它实际上与您自己后处理没有什么不同,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)
于 2013-06-12T21:07:01.570 回答