Ответ 1
Это часто работает достаточно хорошо
import os, sys
if os.isatty(sys.stdout.fileno()):
...
Мне нужно определить, была ли оболочка, вызывающая мой Python script, в интерактивном режиме или нет. Если это было в интерактивном режиме, программа должна выводить на выходе меньше (1) для удобства чтения. Если нет, он должен просто напечатать свой вывод на stdout, чтобы он мог быть удален по трубопроводу к принтеру, файлу или другому пейджеру.
В оболочке script я бы проверил, была ли указана переменная приглашения $PS1 или была указана опция -i среди флагов, хранящихся в переменной $.
Каков предпочтительный метод тестирования интерактивности внутри Python?
Это часто работает достаточно хорошо
import os, sys
if os.isatty(sys.stdout.fileno()):
...
Из эта ссылка вы можете использовать тот же путь и проверить, связано ли stdin с terminate (tty), вы можете сделать это, используя os.isatty(), пример:
>>> os.isatty(0)
True
N.B: по той же ссылке это не удастся, когда вы вызываете команду удаленно через ssh, данное решение должно проверить, связано ли stdin с каналом.
почему не 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.
if sys.flags.interactive:
#interactive
else:
#not interactive
Если у вас уже есть зависимость от matplotlib, или вы не возражаете представить его, вы всегда можете просто вызвать matplotlib.is_interactive()
Я делаю класс покрытия для тестирования.
Например, у вас есть:
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)