如何判断Python脚本是在终端还是通过GUI运行的?
我在使用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
,或者其他地方,比如通过命令行的选项来指定。