如何使用pathlib.Path表示stdin/stdout并实现跨平台兼容
针对三个问题的具体解答
Windows下
-指代stdin的约定适配情况
绝大多数Windows原生常用命令行工具(如sort、findstr)和跨平台CLI工具都已经兼容UNIX的-指代stdin/stdout的约定,只有极个别老旧的Windows内置小众工具不支持该规则。如果是你自己开发的CLI工具,统一遵守该约定即可,不需要额外做系统层面的适配。使用
pathlib.Path跨平台表示stdin的方案pathlib本身没有内置专门指代标准流的特殊实例,但可以通过非常轻量的自定义逻辑实现跨平台兼容:
- 不管是POSIX还是Windows系统,都可以合法创建
Path("-")实例,你可以直接在typer的参数定义中使用Path类型接收路径参数 - 额外加一层简单的判断逻辑:如果拿到的Path对象等于
Path("-"),就直接读取sys.stdin的内容;否则正常调用Path对象的读写方法即可 - 可以把这个逻辑封装成通用工具函数,上层业务代码完全感知不到差异,示例逻辑如下:
import sys from pathlib import Path from typing import TextIO def get_input_stream(path: Path) -> TextIO: if path == Path("-"): return sys.stdin return path.open("r", encoding="utf-8")
如果需要处理真实存在的、文件名为-的文件,按照CLI通用约定传入./-作为路径即可,此时判断逻辑会把它当作普通文件处理。
- stdout的实现逻辑
和stdin的处理逻辑完全一致:
- 约定输出路径为
Path("-")时代表输出到stdout - 封装对应的工具函数判断即可,示例如下:
def get_output_stream(path: Path) -> TextIO: if path == Path("-"): return sys.stdout return path.open("w", encoding="utf-8")
整个方案不需要依赖第三方库,完全跨平台,代码简洁性也足够,和pathlib、typer的适配性非常好。
内容的提问来源于stack exchange,提问作者Chris Wesseling
相关产品推荐
相关产品推荐

