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

时间:2015-10-16 09:30:59

标签: python windows winapi stdout

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

我的问题是如何检测Windows手柄是通向控制台还是nul?是否有WinAPI函数?

1 个答案:

答案 0 :(得分:4)

对于访问字符设备的文件,即_isatty返回FILE_TYPE_CHAR的文件,C运行时的GetFileType函数返回true。要特别检测控制台句柄,您可以调用GetConsoleMode。对于非控制台句柄,此调用失败。要使基础Windows句柄传递给此函数,请调用msvcrt.get_osfhandle。例如:

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