如何在Python Click中区分输入是标准输入(-)还是其他文件?
解决方案
要区分Click中输入的是代表标准输入的-,还是名为<stdin>的实际文件,有两种简单直接的方法:
方法一:通过对象身份判断是否为系统标准输入
Click处理-参数时,会直接返回sys.stdin对象;而打开名为<stdin>的普通文件时,会生成一个全新的TextIOWrapper实例。因此可以用对象身份判断来区分:
import click import sys @click.command() @click.argument("file", type=click.File()) def cli(file): if file is sys.stdin: print("这是通过'-'传入的标准输入") else: print("这是名为'<stdin>'的普通文件") print(file) if __name__ == "__main__": cli()
测试执行结果:
$ python ./cmd.py - 这是通过'-'传入的标准输入 <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'> $ python ./cmd.py '<stdin>' 这是名为'<stdin>'的普通文件 <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
方法二:先接收原始参数字符串再处理
如果需要在打开文件前就判断参数类型,可以先将参数作为字符串接收,再手动处理文件逻辑:
import click import sys @click.command() @click.argument("file_arg") def cli(file_arg): if file_arg == "-": file = sys.stdin print("检测到标准输入(参数为'-')") # 这里添加标准输入的处理逻辑 else: with open(file_arg, 'r', encoding='utf-8') as file: print(f"检测到普通文件:{file_arg}") # 这里添加普通文件的处理逻辑 if __name__ == "__main__": cli()
编码差异说明
两种场景的编码差异,是因为系统标准输入的编码由当前终端环境决定,而普通文件的编码遵循系统默认规则(或打开时指定的编码)。通过上述方法区分后,你可以手动指定统一编码,比如打开普通文件时显式设置encoding='utf-8'。
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

