如何检测 sys.stdout 是否连接到终端?

有没有办法检测 sys.stdout是否连接到控制台终端?例如,我希望能够检测 foo.py 是否通过以下方式运行:

$ python foo.py  # user types this on console

或者

$ python foo.py > output.txt # redirection
$ python foo.py | grep ....  # pipe

我问这个问题的原因是我想确保我的进度条显示只发生在前一种情况下(真正的控制台)。

42263 次浏览

这可以通过 isatty检测到:

if sys.stdout.isatty():
# You're running in a real terminal
else:
# You're being piped or redirected

在 shell 中演示这一点:

  • python -c "import sys; print(sys.stdout.isatty())"应该写真
  • python -c "import sys; print(sys.stdout.isatty())" | cat应该写为 False