Is there a way for a python script to automatically detect whether it is being run interactively or not? Alternatively, can one detect whether ipython is being used versus the regular c python executable?
Background: My python scripts generally have a call to exit() in them. From time to time, I run the scripts interactively for debugging and profiling, usually in ipython. When I'm running interactively, I want to suppress the calls to exit.
Clarification:
Suppose I have a script, myscript.py, that looks like:
#!/usr/bin/python
...do useful stuff...
exit(exit_status)
Sometimes, I want to run the script within an IPython session that I have already started, saying something like:
In [nnn]: %run -p -D myscript.pstats myscript.py
At the end of the script, the exit() call will cause ipython to hang while it asks me if I really want to exit. This is a minor annoyance while debugging (too minor for me to care), but it can mess up profiling results: the exit prompt gets included in the profile results (making the analysis harder if I start a profiling session before going off to lunch).
What I'd like is something that allows me modify my script so it looks like:
#!/usr/bin/python
...do useful stuff...
if is_python_running_interactively():
print "The exit_status was %d" % (exit_status,)
else:
exit(exit_status)
A widely used way to run Python code is through an interactive session. To start a Python interactive session, just open a command-line or terminal and then type in python , or python3 depending on your Python installation, and then hit Enter .
You can use run command in the input prompt to run a Python script. The run command is actually line magic command and should actually be written as %run.
To check the Python version in your Jupyter notebook, first import the python_version function with “ from platform import python_version “. Then call the function python_version() that returns a string with the version number running in your Jupyter notebook such as "3.7. 11" .
Nowadays, you can use the startup folder of ipython, which is located in your home directory (C:\users\[username]\. ipython on Windows). Go into the default profile and you'll see a startup folder with a README file. Just put any Python scripts in there, or if you want ipython commands, put them in a file with an .
I stumbled on the following and it seems to do the trick for me:
def in_ipython():
try:
return __IPYTHON__
except NameError:
return False
Docs say that sys.ps1
doesn't exist in noninteractive mode. Additionally, one can use sys.flags
(for python 2.6+) to detect if we have used python -i <whatever>
.
This scripts detects if we run interactively, non-interactively, and in post-mortem mode (which may be attributed to interactive mode if python interpreter is called using python -i
implicitly and user thinks he landed into "interactive" console):
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
# IPython recognition is missing; test here if __IPYTHON__ exists, etc.
if hasattr(sys, 'ps1'):
print("Running interactively.")
else:
print("Not running interactively...")
if sys.flags.interactive:
print("... but I'm in interactive postmortem mode.")
IPython support can be added as described by Mr Fooz.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With