You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:42:42