代码之家  ›  专栏  ›  技术社区  ›  narnie

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

  •  9
  • narnie  · 技术社区  · 16 年前

    我在Linux中工作,我想知道如何让python知道它是直接从终端运行,还是通过一个GUI(如alt-f2)运行,在这个GUI中,输出需要发送到一个窗口,而不是显示在终端中的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])?

    4 回复  |  直到 10 年前
        1
  •  8
  •   Alex Martelli    16 年前
    $ echo ciao | python -c 'import sys; print sys.stdin.isatty()'
    False
    

    当然,您基于图形用户界面的IDE 可以 选择打开一个伪终端来“愚弄”你(你可以自己做 其他 程序 pexpect 还有,鹅的酱汁是什么…!-,在这种情况下 isatty 或者在python方法中的任何其他方法都不能区分这两者。但同样的伎俩也会“愚弄”你的榜样 bash 程序(完全一样)所以我想你知道。奥思,这个 将 使程序无法通过普通的Unix“管道”接受输入!

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

        2
  •  1
  •   Six Uli Schlachter    11 年前

    我搜索枯肠寻找答案,但到处都显示出 sys.stdout.isatty() 或 os.isatty(sys.stdout.fileno()) . 这些都没有可靠地捕获到我的GUI测试用例。

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

    sys.stdin.isatty()
    
        3
  •  0
  •   Gaius    16 年前

    下面有几个例子 PLEAC 第三种情况是:在交互式Python提示下运行。

        4
  •  0
  •   thebeak    10 年前

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

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