如何让Python流对象的isatty()返回True?

3 投票
2 回答
1638 浏览
提问于 2025-04-17 07:44

通常情况下,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。)

撰写回答