Python 使用argparse从stdin或输入文件读取

Python 使用argparse从stdin或输入文件读取,python,file-io,argparse,Python,File Io,Argparse,我想使用argparse读取stdin或输入文件。换言之: 如果给定了输入文件,请读取该文件 如果不是,则仅当不是终端时才从stdin读取。(即,正在通过管道导入文件) 如果这两个条件都不满足,则向argparse发出输入不正确的信号 我要求的行为类似于中所述,但我希望argparse不会将任何文件识别为失败的输入 使用您链接到的问题中的信息,如何使用sys.stdin.isatty()检查您正在运行的程序实例是否是管道的一部分,如果不是,则从输入文件读取,否则从stdin读取。如果输入文件

我想使用
argparse
读取
stdin
或输入文件。换言之:

  • 如果给定了输入文件,请读取该文件
  • 如果不是,则仅当不是终端时才从stdin读取。(即,正在通过管道导入文件)
  • 如果这两个条件都不满足,则向argparse发出输入不正确的信号

我要求的行为类似于中所述,但我希望
argparse
不会将任何文件识别为失败的输入

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


希望能有所帮助。

我建议只设置
nargs='?'
然后分别处理非类型的情况。根据“FileType对象理解伪参数“-”,并自动将其转换为可读FileType对象的sys.stdin和可写FileType对象的sys.stdout”。所以,如果你想试试看,就试试看吧

例子
import argparse
导入系统
parser=argparse.ArgumentParser()
parser.add_参数('inputfile',nargs='?',type=argparse.FileType('r'))
如果未输入文件:
sys.exit(“请提供一个输入文件,或通过stdin管道传递它”)

fileinput
模块有什么帮助吗?我正试着做类似的事情。当然,可以在运行
argparse
后检查空输入,但这稍微有点难看(特别是因为您必须手动调用
print\u usage()
以获得省略必需参数时所获得的行为)。是的……不太像pythonic。令我惊讶的是,没有一位退伍军人给出了优雅的回答。通常我还没想好这个问题,他们就发帖了。