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

时间:2010-09-29 03:25:37

标签: python user-interface shell testing

我在Linux工作,我想知道如何让python告诉它是直接从终端运行还是通过GUI(如alt-F2)运行,其中输出需要发送到窗口而不是stdout将出现在终端。

在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 个答案:

答案 0 :(得分:8)

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

当然,您的基于GUI的IDE 可能选择通过打开伪终端来“欺骗”您(您可以使用{自己动手其他程序) {3}},以及鹅的什么酱......! - ),在这种情况下isatty或任何其他Python内部方法都无法区分。但同样的伎俩也会“愚弄”你的示例bash程序(以完全相同的方式),所以我猜你已经意识到了这一点。 OTOH,这个使程序无法通过普通的Unix“管道”接受输入!

因此,更可靠的方法可能是明确告诉该程序是否必须输出到stdout或其他地方,例如使用命令行标志。

答案 1 :(得分:1)

我搜索SE以获得答案,但到处都表示使用了sys.stdout.isatty()os.isatty(sys.stdout.fileno())。这些都没有可靠地抓住我的GUI测试用例。

测试标准输入是唯一对我有用的东西:

sys.stdin.isatty()

答案 2 :(得分:0)

PLEAC上有几个这样的例子,它们计入第三种情况:在交互式Python提示符下运行。

答案 3 :(得分:0)

我有同样的问题,我做了如下:

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 ...

答案 4 :(得分:0)

在bash中,我使用以下脚本:

$ cat ~/bin/test-term.sh

#!/bin/bash

#See if $TERM has been set when called from Desktop shortcut

echo TERM environment variable: $TERM > ~/Downloads/test-term.txt
echo "Using env | grep TERM output below:" >> ~/Downloads/test-term.txt
env | grep TERM >> ~/Downloads/test-term.txt

exit 0

创建桌面快捷方式以调用脚本时,输出为:

$ cat ~/Downloads/test-term.txt

TERM environment variable: dumb
Using env | grep TERM output below:

通知grepping env命令不会返回任何内容吗?

现在从命令行调用脚本:

$ cat ~/Downloads/test-term.txt

TERM environment variable: xterm-256color
Using env | grep TERM output below:
TERM=xterm-256color

这次,来自env命令的TERM变量返回xterm-256color

在Python中,您可以使用:

#import os
result = os.popen("echo $TERM")
result2 = os.popen("env | grep TERM")

然后检查结果。我尚未在python中完成此操作,但可能需要尽快完成当前的项目。我来这里是为了寻找现成的解决方案,但是还没有人发布这样的解决方案。