我有一个使用一些参数和一些stdin
数据的脚本。
为了检查参数,我使用了argparse.ArgumentParser
是否可以检查是否有stdin数据?这样的事情:
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin, required=True)
但是这个例子给出了这个错误:
TypeError:'required'是位置符号的无效参数
答案 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)
required - 是否可以省略命令行选项(仅限选项)。
required
关键字仅用于选项(例如,-f
或--foo
),不用于位置参数。把它拿出来吧。
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
default=sys.stdin)
解析时infile
将是字符串或sys.stdin
文件对象。您需要读取该文件以查看其中是否有任何内容。阅读可能有风险......你可能永远阻止。但这只意味着用户没有遵循指示。