我在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])?
答案 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中完成此操作,但可能需要尽快完成当前的项目。我来这里是为了寻找现成的解决方案,但是还没有人发布这样的解决方案。