如何检测stdio是否被重定向到nul?

2024-06-02 16:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个包来修复在标准Windows控制台环境中运行的Python中Unicode的几个问题:https://github.com/Drekin/win-unicode-console。关键操作是在需要时替换标准流对象。为此,我需要检测标准流是否被重定向。Python方法isatty()工作正常,但有一个例外:如果流被重定向到nul,则isatty()返回True。你知道吗

我的问题是如何检测Windows句柄是指向控制台还是指向nul?有WinAPI函数吗?你知道吗


Tags: httpsgithubcom标准windowsunicodewin重定向
1条回答
网友
1楼 · 发布于 2024-06-02 16:20:59

对于访问字符设备的文件,即^{}返回FILE_TYPE_CHAR的文件,C运行时的^{}函数返回true。要特别检测控制台句柄,可以调用^{}。对于非控制台句柄,此调用失败。要获取传递给此函数的底层Windows句柄,请调用^{}。例如:

import ctypes
import msvcrt

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
ERROR_INVALID_HANDLE = 6

def isconsole(fd):
    handle = msvcrt.get_osfhandle(fd)
    if kernel32.GetConsoleMode(handle, ctypes.byref(ctypes.c_uint())):
        return True
    last_error = ctypes.get_last_error()
    if last_error != ERROR_INVALID_HANDLE:
        raise ctypes.WinError(last_error)
    return False

相关问题 更多 >