Detectar cuándo un script de python se ejecuta interactivamente en ipython

¿Hay alguna forma de que un script de Python detecte automáticamente si se está ejecutando de forma interactiva o no? Alternativamente, ¿se puede detectar si se está usando ipython en comparación con el ejecutable regular de python?

Antecedentes: Mis scripts de python generalmente tienen una llamada a exit () en ellos. De vez en cuando, ejecuto los scripts de forma interactiva para la depuración y la creación de perfiles, generalmente en ipython. Cuando estoy corriendo de forma interactiva, quiero suprimir las llamadas para salir.

Aclaración :

Supongamos que tengo un script, myscript.py, que se parece a:

#!/usr/bin/python ...do useful stuff... exit(exit_status) 

A veces, quiero ejecutar el script dentro de una sesión de IPython que ya he comenzado, diciendo algo como:

 In [nnn]: %run -p -D myscript.pstats myscript.py 

Al final de la secuencia de comandos, la llamada exit () hará que ipython se bloquee mientras me pregunta si realmente quiero salir. Esta es una molestia menor durante la depuración (demasiado pequeña para mi atención), pero puede estropear los resultados de creación de perfiles: el indicador de salida se incluye en los resultados del perfil (lo que dificulta el análisis si comienzo una sesión de creación de perfiles antes de ir a almorzar) .

Lo que me gustaría es algo que me permita modificar mi script para que se vea como:

 #!/usr/bin/python ...do useful stuff... if is_python_running_interactively(): print "The exit_status was %d" % (exit_status,) else: exit(exit_status) 

Me detuve en lo siguiente y parece hacer el truco para mí:

 def in_ipython(): try: __IPYTHON__ except NameError: return False else: return True 

Los documentos dicen que sys.ps1 no existe en modo no interactivo. Además, uno puede usar sys.flags (para python 2.6+) para detectar si hemos usado python -i .

Estos scripts detectan si ejecutamos de forma interactiva, no interactiva y en modo post mortem (que puede atribuirse al modo interactivo si se llama a Python interprete usando python -i implícitamente y el usuario cree que aterrizó en la consola “interactiva”):

 #!/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.") 

El soporte de IPython se puede agregar como lo describe el Sr. Fooz.

Cuando se invoca de forma interactiva, Python ejecutará el script en $ PYTHONSTARTUP, por lo que simplemente podría tener esa variable de entorno invocar un script que establece una