如何判断Python脚本是在终端还是通过GUI运行的?

13 投票
5 回答
7697 浏览
提问于 2025-04-16 04:44

我在使用Linux,想知道怎么让Python判断它是直接从终端运行的,还是通过图形界面(比如按下alt-F2)运行的。在后者的情况下,输出需要发送到一个窗口,而不是终端的标准输出。

在bash中,可以这样做:

if [ -t 0 ] ; then  
    echo "I'm in a terminal"
else
    zenity --info --title "Hello" --text "I'm being run without a terminal"
fi

那么在Python中怎么实现呢?换句话说,怎么能达到类似于[ -t 0 ]的效果?

5 个回答

1

我也遇到过同样的问题,我是这样解决的:

import sys

mode = 1
try:
    if sys.stdin.isatty():
        mode = 0
except AttributeError:  # stdin is NoneType if not in terminal mode
    pass

if mode == 0:
    # code if terminal mode ...
else:
    # code if gui mode ...
2

我在Stack Overflow上找了很多答案,但大家都提到要用 sys.stdout.isatty()os.isatty(sys.stdout.fileno())。可是这两个方法在我的图形用户界面(GUI)测试中都不太可靠。

只有测试标准输入的方法对我有效:

sys.stdin.isatty()
10
$ echo ciao | python -c 'import sys; print sys.stdin.isatty()'
False

当然,你的图形界面IDE可能会选择用一种伪终端来“欺骗”你(你也可以用pexpect这个工具对其他程序这么做,反正大家都是一样的嘛!),在这种情况下,isatty或者其他Python内部的方法就无法区分了。不过,同样的把戏也会“欺骗”你提到的bash程序(方式完全一样),所以我想你应该知道这一点。另一方面,这样做会让程序无法通过普通的Unix“管道”接受输入!

因此,一个更可靠的方法可能是明确地告诉程序它应该输出到stdout,或者其他地方,比如通过命令行的选项来指定。

撰写回答