Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse:参数的可选值和位置值_Python_Command Line Arguments_Argparse - Fatal编程技术网

Python argparse:参数的可选值和位置值

Python argparse:参数的可选值和位置值,python,command-line-arguments,argparse,Python,Command Line Arguments,Argparse,考虑以下用法: usage: do.py [-h] [-s | -m] filename 这不是完整的用法。但我实际上希望isfilename是文件的实际值,而不是: --filename FILENAME 但是,filename应该是可选的,这样我就可以从标准输入中读取。考虑一下UNIX上的cat程序 你只是说: cat filename 或 编辑:现在,如果我在没有任何命令行选项的情况下执行程序do.py,我将得到一个错误:参数太少。相反,即使我没有给它一个有效的文件名,我仍然希望它执

考虑以下用法:

usage: do.py [-h] [-s | -m] filename
这不是完整的用法。但我实际上希望is
filename
是文件的实际值,而不是:

--filename FILENAME
但是,
filename
应该是可选的,这样我就可以从标准输入中读取。考虑一下UNIX上的
cat
程序

你只是说:

cat filename


编辑:现在,如果我在没有任何命令行选项的情况下执行程序
do.py
,我将得到一个
错误:参数太少
。相反,即使我没有给它一个有效的
文件名
,我仍然希望它执行。如何做到这一点?

从ArgParse文档更新2:

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...>)
通常,
-
用于表示标准输入/标准输出

然后你可以这样做:

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='?'

这些文件看起来很漂亮,如果稍微轻一点的话。问题是什么?请编辑你的文章的主体,包括你在解决方案上的尝试,人们会为你指出正确的方向。谢谢。现在如果我在没有任何命令行选项的情况下执行do.py程序,我会得到一个错误:参数太少。相反,即使我没有文件名,我仍然希望它执行。required=False不适用于位置。这是正确的,先生。我实际上使用了nargs选项,在文档中看到了它。我不想让用户看到这样的情况:用法:do.py[-h][s |-m][filename[filename…]]他应该只看到filename是可选的,并且只有一个值可以选择。对于零或一个位置,这将是
nargs='?'
;参见@flippex17:当你说你在文档中看到了
nargs
选项时,我很难相信你。。。因为如果您一直在看文档,您肯定会看到
?”
,哦,太好了。谢谢很好,迪特里希。我确实看到了文件。我确实试过“*”,但我没有想到使用“?”,这是非常不幸的。谢谢。另外,我在看2.7.3。真的很抱歉。非常感谢。
>>> 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')