I need to determine whether the shell which invoked my Python script was in interactive mode or not. If it was in interactive mode, the program should pipe output to less(1) for easy reading. If not, it should simply print its output to stdout, to allow it to be piped away to a printer, file, or a different pager.
In a shell script, I would have checked if the prompt variable $PS1 was defined, or looked for the -i option among the flags stored in the $- variable.
What is the preferred method for testing interactivity from within Python?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
This is often works well enough
import os, sys
if os.isatty(sys.stdout.fileno()):
...
Method 2
From this link you can use the same way and test if stdin is associated to a terminate(tty), you can do this using os.isatty(), example:
>>> os.isatty(0) True
N.B: From the same link this will fails when you invoke the command remotely via ssh, the solution given is to test if stdin is associated to a pipe.
Method 3
If you already have a dependency on matplotlib, or you don’t mind introducing one, you can always just call matplotlib.is_interactive()
Method 4
if sys.flags.interactive:
#interactive
else:
#not interactive
http://docs.python.org/library/sys.html#sys.flags
Method 5
I make a cover class for testing.
For example you have :
class SuperInteractiveClass(object):
def get_data_from_stdin(self):
'... a lot of code here ...'
'... and a lot of other function'
I make a second class, just for testing
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)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0