Chinmay Kanchi
Chinmay Kanchi

Reputation: 65843

Tell if Python is in interactive mode

In a Python script, is there any way to tell if the interpreter is running in interactive mode? This would be useful so that, for instance, when you run an interactive Python session and import a module, different code can be executed.

What I mean is something like this:

if __name__ == "__main__":
    # do stuff
elif __pythonIsInteractive__:
    # do other stuff
else:
    exit()

Upvotes: 77

Views: 22916

Answers (7)

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798436

Python <= 3.12

__main__.__file__ doesn't exist in the interactive interpreter for Python versions <= 3.12:

import __main__
print(hasattr(__main__, "__file__"))

This also goes for code run via python -c, but not python -m.

Upvotes: 70

pyjamas
pyjamas

Reputation: 5357

I compared all the methods I found and made a table of results. The best one seems to be this:

hasattr(sys, 'ps1')

enter image description here

If anyone has other scenarios that might differ, comment and I'll add it

Upvotes: 67

Pych
Pych

Reputation: 299

Use sys.flags:

if sys.flags.interactive:
    #interactive
else:
    #not interactive 

Upvotes: 22

ChristopheD
ChristopheD

Reputation: 116097

sys.ps1 and sys.ps2 are only defined in interactive mode.

Upvotes: 30

jdines
jdines

Reputation: 17

The following works both with and without the -i switch:

#!/usr/bin/python
import sys
# Set the interpreter bool
try:
    if sys.ps1: interpreter = True
except AttributeError:
    interpreter = False
    if sys.flags.interactive: interpreter = True

# Use the interpreter bool
if interpreter: print 'We are in the Interpreter'
else: print 'We are running from the command line'

Upvotes: 0

JAB
JAB

Reputation: 21079

Here's something that would work. Put the following code snippet in a file, and assign the path to that file to the PYTHONSTARTUP environment variable.

__pythonIsInteractive__ = None

And then you can use

if __name__=="__main__":
    #do stuff
elif '__pythonIsInteractive__' in globals():
    #do other stuff
else:
    exit()

http://docs.python.org/tutorial/interpreter.html#the-interactive-startup-file

Upvotes: -5

wersimmon
wersimmon

Reputation: 2869

From TFM: If no interface option is given, -i is implied, sys.argv[0] is an empty string ("") and the current directory will be added to the start of sys.path.

If the user invoked the interpreter with python and no arguments, as you mentioned, you could test this with if sys.argv[0] == ''. This also returns true if started with python -i, but according to the docs, they're functionally the same.

Upvotes: 7

Related Questions