sys.stderr中何时没有属性`isatty()`?

时间:2018-06-06 18:23:22

标签: python python-3.x dynamic attributes

有时此属性不存在。 (例如,thisthis) 这是什么时候发生的?有办法解决它吗?我可以以某种方式强行添加此属性以使事情运行吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是,只有当sys.stderr被模拟或猴子修补时才会发生这种情况。

例如,您引用的the first GitHub issue有以下错误消息:

AttributeError: 'UnicodeStdout' object has no attribute 'isatty'

这个类UnicodeStdout不在标准库中,我的研究指向了hachoir lib的旧版本(例如this commit)。

second link还有另一条可疑的错误消息,其中仅有类的名称表示sys.stdout被搞砸了:

AttributeError: '_StdoutProxy' object has no attribute 'isatty'

这个类似乎是一个“代理”,它没有实现原始sys.stdout的所有方法。这不仅会影响isatty(),还会影响其他属性,例如fileno(例如,请参阅this other issue。)

您可以自己对该属性进行修补:

sys.stderr = SomeProxyClass()

或添加支票,例如:

if hasattr(sys.stderr, 'isatty') and sys.stderr.isatty()

但在大多数情况下,没有必要。