我想用来argparse
从任何一个 stdin
或一个输入文件中读取。换句话说:
- 如果给出了输入文件,请阅读该文件。
- 如果不是,则仅当它不是终端时才从标准输入读取。(即正在输入一个文件)
- 如果这些条件都不满足,则向 argparse 发出信号,表明输入不正确。
我要求的行为类似于此问题中描述的行为,但我不想argparse
将任何文件识别为失败的输入。
我建议只设置设置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")
使用您链接到的问题中的信息,如何使用sys.stdin.isatty()
来检查您的程序正在运行的实例是否是管道的一部分,如果不是,则从输入文件中读取,否则从stdin
. 如果输入文件不存在或stdin
为空,则抛出错误。
希望有帮助。