我可以根据需要使用Python argparse设置stdin吗?

时间:2016-11-11 13:10:12

标签: python argparse

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

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

是否可以检查是否有stdin数据?这样的事情:

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

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

  

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

3 个答案:

答案 0 :(得分:1)

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

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

然后,您可以使用简单的if not data: ...

测试它是否为空

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

(至于错误,required仅告知是否必须在命令行上为--options-o选项提供一些选项。除非您更改,否则始终需要定位他们的号码为nargs)。

答案 1 :(得分:1)

错误只是因为required=True参数;并且消息告诉你什么是错的。它应该是:

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

通过'调用'这个infile而不是'--infile',你创建了一个位置参数。 argparse本身确定是否需要。使用nargs='?'时,不需要它。它的定义是可选的(但不是optionals参数:))。

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

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

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

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

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

答案 2 :(得分:0)

来自文档The add_argument() method

  

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

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

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

解析时infile将是字符串或sys.stdin文件对象。您需要读取该文件以查看其中是否有任何内容。阅读可能有风险......你可能永远阻止。但这只意味着用户没有遵循指示。