如何让Python流对象的isatty()返回True?
通常情况下,isatty()
这个函数可以告诉你一个流是否是TTY(终端设备),这也是判断标准输出(stdout)或错误输出(stderr)是否是控制台的常用方法。
但是,当你在一个集成开发环境(IDE)中运行脚本时,输出会被重定向,这时候isatty()
会返回False,或者根本没有定义这个函数。
我想给sys.stdout
或者sys.__stdout__
添加这个属性,以便改变一个库在检查TTY时的行为。
不过,我希望能在不替换对象本身为代理的情况下做到这一点,如果可能的话。
# some logic...
setattr(sys.stdout, 'isatty', True)
>> AttributeError: 'file' object attribute 'isatty' is read-only
2 个回答
0
这是对@Fred Foo评论的小补充。我用过这个,得到了:
AttributeError: 'OutputManager' object has no attribute 'encoding'
所以我做了这个小改动,现在它可以正常工作了。
class PseudoTTY(object):
def __init__(self, underlying):
underlying.encoding = 'cp437'
self.__underlying = underlying
def __getattr__(self, name):
return getattr(self.__underlying, name)
def isatty(self):
return True
sys.stdout = PseudoTTY(sys.stdout)
5
使用一个代理对象。没有我能想到的更简单的解决办法了。
class PseudoTTY(object):
def __init__(self, underlying):
self.__underlying = underlying
def __getattr__(self, name):
return getattr(self.__underlying, name)
def isatty(self):
return True
sys.stdin = PseudoTTY(sys.stdin)
(另一种解决方案会涉及到ptys。)