Как узнать, запускается ли скрипт Python в терминале или через графический интерфейс?

Я работаю в Linux, и мне интересно, как заставить python определять, запускается ли он напрямую с терминала или через графический интерфейс (например, alt-F2), где вывод нужно будет отправлять в окно, а не в стандартный вывод, который появится в терминал.

В 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])?


person narnie    schedule 29.09.2010    source источник
comment
обратите внимание, что isatty не сможет правильно определить трубы   -  person cobbal    schedule 29.09.2010
comment
sys.stdout.isatty () и os.isatty (0) - это именно то, что я искал. Здорово. Спасибо. Если вы сформируете его как ответ, я его приму.   -  person narnie    schedule 29.09.2010
comment
@cobbal, ты прав. Это дубликат концепции, только заданный другим способом. Спасибо.   -  person narnie    schedule 29.09.2010
comment
Возможный дубликат проверки интерактивной оболочки в скрипте Python   -  person ideasman42    schedule 29.08.2017


Ответы (5)


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

Конечно, ваша IDE на основе графического интерфейса может "обмануть" вас, открыв вместо этого псевдотерминал (вы можете сделать это самостоятельно с другими программами с помощью pexpect, и какой соус для гуся ...! -), и в этом случае isatty или любой другой внутри- Подход Python не может отличить. Но этот же трюк также "обманет" ваш пример bash программы (точно таким же образом), так что я думаю, вы знаете об этом. OTOH, это сделает невозможным для программы принимать ввод через обычный «канал» Unix!

Поэтому более надежным подходом может быть явное указание программы, должна ли она выводить в stdout или куда-то еще, например с флагом командной строки.

person Alex Martelli    schedule 29.09.2010
comment
Бывают случаи, когда я использовал явные флаги при написании сценариев, но иногда мне хотелось бы, чтобы автоматическое решение понимало, при каких обстоятельствах это будет необходимо. Но я все же отложу эту мысль на второй план. - person narnie; 29.09.2010

Я поискал в SE ответ на этот вопрос, но везде указывал на использование sys.stdout.isatty() или os.isatty(sys.stdout.fileno()). Ни один из них надежно не отразил мои тестовые примеры графического интерфейса.

Единственное, что у меня сработало - это тестирование стандартного ввода:

sys.stdin.isatty()
person Six    schedule 27.02.2015

Есть несколько примеров этого в PLEAC, который учитывается в третьем случае: запуск в интерактивном Подсказка Python.

person Gaius    schedule 29.09.2010
comment
Мне понравился optparse для синтаксического анализа CL. Вы предпочитаете гетопты? Если так, то мне любопытно, почему. Я новичок в программировании и очень хочу узнать, почему и почему. - person narnie; 30.09.2010
comment
OptParse лучше. Но getopt работает одинаково на C, Python, Haskell, на любом языке, о котором вы можете подумать. Если вы работаете на множестве разных языков, вы можете предпочесть это. - person Gaius; 30.09.2010

У меня была такая же проблема, и я сделал следующее:

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 ...
person thebeak    schedule 03.03.2016

В 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

На этот раз переменная TERM из команды env возвращает xterm-256color

В Python вы можете использовать:

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

Затем проверьте результаты. Я еще не делал этого на python, но, вероятно, скоро это понадобится для моего текущего проекта. Я пришел сюда в поисках готового решения, но никто еще не опубликовал подобное.

person WinEunuuchs2Unix    schedule 18.09.2020