Подтвердить что ты не робот

Проверка интерактивной оболочки в Python script

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

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

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

4b9b3361

Ответ 1

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

import os, sys
if os.isatty(sys.stdout.fileno()):
    ...

Ответ 2

Из эта ссылка вы можете использовать тот же путь и проверить, связано ли stdin с terminate (tty), вы можете сделать это, используя os.isatty(), пример:

>>> os.isatty(0)
True

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

Ответ 3

почему не symply (python3.X):

import os
def is_interactive():
    'check if current session is interactive'
    try:
        os.path.isdir(os.path.abspath(__file__))
        return(False)
    except:
        return(True)

он также работает, если код запускается в ноутбуке jupyter.

Ответ 5

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

Ответ 6

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

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

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)