如何判断python脚本是在终端中运行还是通过GUI运行?
我在Linux中工作,想知道如何让python知道它是直接从终端运行还是通过GUI(如alt-F2)运行,在GUI中,输出需要发送到窗口,而不是终端中出现的标准输出 在bash中,这可以通过以下方式完成:如何判断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中实现
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:
请注意,greppingenv
命令不返回任何内容
现在从命令行调用脚本:
$ 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")