5

我想用来argparse任何一个 stdin 一个输入文件中读取。换句话说:

  • 如果给出了输入文件,请阅读该文件。
  • 如果不是,则仅当它不是终端时才从标准输入读取。(即正在输入一个文件)
  • 如果这些条件都不满足,则向 argparse 发出信号,表明输入不正确。

我要求的行为类似于此问题中描述的行为,但我不想argparse将任何文件识别为失败的输入。

4

2 回答 2

2

我建议只设置设置nargs='?',然后单独处理 Nonetype 的情况。根据官方文档“FileType 对象理解伪参数'-',并自动将其转换为可读 FileType 对象的 sys.stdin 和可写 FileType 对象的 sys.stdout”。所以,如果你想要标准输入,就给它一个破折号。

例子

import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('inputfile', nargs='?', type=argparse.FileType('r'))
if not inputfile:
    sys.exit("Please provide an input file, or pipe it via stdin")
于 2018-11-04T14:12:50.837 回答
1

使用您链接到的问题中的信息,如何使用sys.stdin.isatty()来检查您的程序正在运行的实例是否是管道的一部分,如果不是,则从输入文件中读取,否则从stdin. 如果输入文件不存在或stdin为空,则抛出错误。

希望有帮助。

于 2013-05-16T09:08:20.313 回答