Проверка наличия интерактивной оболочки в скрипте Python - PullRequest
24 голосов
/ 24 мая 2011

Мне нужно определить, была ли оболочка, которая вызвала мой скрипт Python, в интерактивном режиме или нет.Если это было в интерактивном режиме, программа должна направить вывод в less (1) для удобства чтения.Если нет, он должен просто напечатать свой вывод в stdout, чтобы позволить ему передать его на принтер, файл или другой пейджер.

В сценарии оболочки я бы проверил, если переменная приглашения $PS1 был определен или искал опцию -i среди флагов, хранящихся в переменной $ -.

Какой метод тестирования интерактивности предпочтителен в Python?

Ответы [ 5 ]

31 голосов
/ 24 мая 2011

Это часто работает достаточно хорошо

import os, sys
if os.isatty(sys.stdout.fileno()):
    ...
2 голосов
/ 24 мая 2011

С по этой ссылке вы можете использовать тот же способ и проверить, связан ли stdin с завершением (tty), вы можете сделать это с помощью os.isatty () , пример:

>>> os.isatty(0)
True

N.B: по той же ссылке это не будет работать, когда вы вызываете команду удаленно через ssh, решение - проверить, связан ли stdin с каналом.

0 голосов
/ 15 декабря 2012

Если у вас уже есть зависимость от matplotlib или вы не против ее введения, вы всегда можете просто вызвать matplotlib.is_interactive ()

0 голосов
/ 30 июля 2011
if sys.flags.interactive:
    #interactive
else:
    #not interactive 

http://docs.python.org/library/sys.html#sys.flags

0 голосов
/ 24 мая 2011

Я делаю класс покрытия для тестирования.

Например, у вас есть:

class SuperInteractiveClass(object):
   def get_data_from_stdin(self):
      '... a lot of code here ...'
   '... and a lot of other function'

Я делаю второй класс, просто для тестирования

class TestSuperInteractiveClass(SuperInteractiveClass):
    prepared_data = []
    def add_prepared_data(self,data):
        self.prepared_data.append(data)
    def get_data_from_stdin(self):
          return self.prepared_data.pop(0)
...