【问题标题】:Can I set stdin as required with Python argparse?我可以根据需要使用 Python argparse 设置标准输入吗?
【发布时间】:2016-11-12 01:33:55
【问题描述】:

我有一个使用一些参数和一些stdin 数据的脚本。

为了检查参数,我使用 argparse.ArgumentParser

是否可以检查是否提供了任何标准输入数据?类似的东西:

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, required=True)

但是这个例子给出了这个错误:

TypeError: 'required' 是位置参数的无效参数

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    没有。它不会从您传递的任何文件中读取,无论是在命令行还是标准输入中给出的。您将获得一个打开的文件句柄,甚至不会消耗一个字节/字符。

    只需自己读取数据,例如使用data = args.infile.read()(假设args 是解析的结果`)。

    然后你可以测试它是否为空,用一个简单的if not data:...

    但通常,如果您希望数据采用特定格式,最好的办法是简单地尝试解析它,如果失败则引发错误。空数据无效(例如 json),或者它是有效的但它应该是可接受的输入。

    (至于错误,required 仅告诉是否必须在命令行上给出某些选项,对于 --options-o 选项。除非您使用 nargs 更改它们的数字,否则始终需要位置)。

    【讨论】:

      【解决方案2】:

      错误只是因为required=True参数;该消息会告诉您出了什么问题。应该是:

      parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
      

      通过“调用”这个infile,而不是“--infile”,您创建了一个位置参数。 argparse 自己决定是否需要。对于nargs='?',它不是必需的。根据定义,它是可选的(但不是optionals 参数:))。

      FileType 类型允许您在命令行中命名文件(或“-”)。它将打开它(标准输入已经打开)并将其分配给args.infile 属性。它什么也不做。

      因此,在解析之后,使用args.infile 可以让您访问这个打开的文件,您可以根据需要读取该文件(如果不是标准输入,也可以选择关闭)。

      因此,这是让您的用户指定应打开哪个文件以在您的代码中使用的便捷方式。它适用于读取一个文件、执行某项操作以及写入另一个文件的简单脚本。

      但是如果你看到的只是stdin,那么使用这种类型就没有任何意义了。 sys.stdin 始终可供阅读。而且没有任何方法可以让解析器读取stdin。它解析来自命令行的sys.argv

      有一个@ 前缀文件功能,它告诉解析器从文件中读取命令行字符串。它解析文件并将值拼接到sys.argv。请参阅argparse 文档。

      【讨论】:

        【解决方案3】:

        来自文档The add_argument() method

        必需 - 是否可以省略命令行选项(仅限可选)。

        required 关键字仅用于选项(例如,-f--foo),而不用于位置参数。把它拿出来。

        parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
            default=sys.stdin)
        

        解析时infile 将是一个字符串或sys.stdin 文件对象。您需要阅读该文件以查看其中是否有任何内容。阅读可能有风险……您可能会永远受阻。但这只是意味着用户没有按照说明进行操作。

        【讨论】:

          猜你喜欢
          • 2013-11-26
          • 1970-01-01
          • 2011-11-26
          • 2016-01-14
          • 1970-01-01
          • 2021-08-01
          • 1970-01-01
          • 2011-01-15
          • 1970-01-01
          相关资源
          最近更新 更多