Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何判断python脚本是在终端中运行还是通过GUI运行?_Python_User Interface_Shell_Testing - Fatal编程技术网

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

如何判断python脚本是在终端中运行还是通过GUI运行?,python,user-interface,shell,testing,Python,User Interface,Shell,Testing,我在Linux中工作,想知道如何让python知道它是直接从终端运行还是通过GUI(如alt-F2)运行,在GUI中,输出需要发送到窗口,而不是终端中出现的标准输出 在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中实现

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

在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中实现这一点?换句话说,等价于[-t0])

当然,您基于GUI的IDE可能会选择打开一个伪终端来“愚弄”您(您可以自己对其他程序使用,以及,what's sauce for the goose…!-),在这种情况下,
isatty
或Python中的任何其他方法都无法区分两者之间的区别。但是同样的技巧也会“愚弄”你的示例
bash
程序(以完全相同的方式),所以我想你已经意识到了这一点。OTOH,这将使程序无法通过普通的Unix“管道”接受输入


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

有几个这样的例子,第三种情况是:在交互式Python提示符下运行

我在SE中寻找答案,但到处都表明使用了
sys.stdout.isatty()
os.isatty(sys.stdout.fileno())
。这两个都不能可靠地捕获我的GUI测试用例

测试标准输入是唯一对我有效的事情:

sys.stdin.isatty()

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

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

在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
命令的术语变量返回
xterm-256color

在Python中,您可以使用:

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

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

是否满足了您的需要?是否可能重复easy way:
sys.stdout.isatty()
请注意,
isatty
将无法正确检测管道sys.stdout.isatty()和os.isatty(0)正是我要寻找的。伟大的谢谢如果你把它作为一个答案,我会接受的。@cobbal,你是对的。这是一个重复的概念,只是以不同的方式问。谢谢。有时我在编写脚本时会使用显式标志,但有时我希望能够自动了解在什么情况下需要它。不过,我还是把这个想法放在后面。我开始喜欢用optparse进行CL解析。你更喜欢运动鞋吗?如果是这样,我很好奇为什么。我是编程新手,渴望了解“为什么”和“为什么”。OptPass更好。但是getopt在C、Python、Haskell以及任何你能想到的语言中都是一样的。如果你使用多种不同的语言工作,你可能会更喜欢它。
#import os
result = os.popen("echo $TERM")
result2 = os.popen("env | grep TERM")