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