2016-11-11 41 views
1

我有一个脚本,使用一些参数和一些stdin数据。我可以使用Python argparse根据需要设置stdin吗?

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

是否可以检查是否有任何标准输入给出的数据是?类似的东西:

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

但这个例子给出了这样的错误:

TypeError: 'required' is an invalid argument for positionals

回答

1

号这wont't无论从任何文件,你通过它,可以在命令行或标准输入上给定的读取。你会得到一个开放的文件句柄,甚至没有消耗一个字节/字符。

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

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

但通常,如果你希望在一个特定格式的数据,最好是简单地尝试分析它,并引发错误如果你失败了。无论是空数据无效(例如json),或者它是有效的,但它应该是一个可接受的输入。

(到错误,required只是告诉是否有些选项必须在命令行上给出,对于--options-o选项。除非你改变自己的号码与nargs Positionals总是需要)。

0

从文档The add_argument() method

required - Whether or not the command-line option may be omitted (optionals only).

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

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

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

1

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

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

通过“呼叫”这个infile,而不是“--infile”,你已经创建了一个位置参数。​​本身决定它是否需要。用nargs='?'它不是必需的。它的定义是可选的(但不是optionals参数:))。

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

所以解析后,使用args.infile,您可以访问该打开的文件,您可以根据需要阅读(并且选择性地关闭如果不是标准输入)。

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

但是,如果你正在看的是stdin,使用这种类型没有任何意义。 sys.stdin始终可供阅读。并且没有任何方法使解析器读取stdin。它分析来自命令行的sys.argv

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

相关问题