【问题标题】:Python argparse: both optional and positional value for an argumentPython argparse:参数的可选值和位置值
【发布时间】:2013-01-28 10:46:21
【问题描述】:

考虑以下用法:

usage: do.py [-h] [-s | -m] filename

这不是完整的用法。但我实际上希望 filename 成为文件的实际值,而不是:

--filename FILENAME

而且,filename 应该是可选的,所以我可以从标准输入中读取。想想 UNIX 上的 cat 程序。

你只是说:

cat filename

cat

编辑:现在,如果我在没有任何命令行选项的情况下执行程序do.py,我将得到一个error: too few arguments。相反,即使我没有给它一个有效的filename,我仍然希望它执行。我该怎么做?

【问题讨论】:

  • 这些规格看起来不错,但有点轻巧。问题是什么?请编辑您的帖子正文以包含您对解决方案的尝试,人们会为您指明正确的方向。谢谢。
  • 现在如果我在没有任何命令行选项的情况下执行程序do.py,我会得到一个错误:参数太少。相反,即使我没有文件名,我仍然希望它执行。
  • required=False 不适用于位置。

标签: python command-line-arguments argparse


【解决方案1】:

更新 2:来自 ArgParse 文档,

nargs='?' 的更常见用法之一是允许可选的输入和输出文件:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
...                     default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
...                     default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>,
          outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>,
          outfile=<open file '<stdout>', mode 'w' at 0x...>)

原答案:

这很简单:只需添加一个带有默认值和nargs='*' 的位置参数。如果参数为零,则使用默认值,否则将使用命令行中的参数:

>>> p = argparse.ArgumentParser()
>>> p.add_argument('filename', nargs='*', default=['-'])
>>> p.parse_args([])
Namespace(filename=['-'])
>>> p.parse_args(['abc'])
Namespace(filename=['abc'])

通常,- 用于指代标准输入/标准输出。

然后你做这样的事情:

def get_inputs(ns):
    """Iterate over input files."""
    for path in ns.filename:
        if path == '-':
            yield sys.stdin
        else:
            yield open(path, 'r')

更新:我假设你想要多个文件名,因为 cat 需要多个文件名。如果你想要零个或一个文件名,你可以使用nargs='?'

【讨论】:

  • 这是正确的先生。我实际上使用了在文档中看到的 nargs 选项。我不希望用户看到这个:用法:do.py [-h] [-s | -m] [filename [filename ...]] 他应该只看到文件名是可选的,并且只有一个值是可能的。
  • 这将是nargs='?' 用于零或一个位置;见docs.python.org/dev/library/argparse.html#nargs
  • @flippex17:当你说你在文档中看到了nargs 选项时,我很难相信你......因为如果你一直在看,你肯定会看到'?'文档...
  • 哦,太好了。谢谢。那很好,迪特里希。我确实看到了文档。我确实尝试过'*',但我并没有使用'?这是非常不幸的。谢谢。
  • 另外,我正在查看 2.7.3。所以真的很抱歉。谢谢。
猜你喜欢
  • 2019-04-13
  • 2015-11-07
  • 1970-01-01
  • 2017-05-17
  • 2011-05-27
  • 2019-01-28
  • 1970-01-01
相关资源
最近更新 更多