2009-07-31 25 views
6

¿Hay alguna manera de que una secuencia de comandos python detecte automáticamente si se está ejecutando interactivamente o no? Alternativamente, ¿se puede detectar si se está utilizando ipython en comparación con el ejecutable c python regular?Detectando cuando una secuencia de comandos python se ejecuta de forma interactiva en ipython

Antecedentes: Mis scripts de python generalmente tienen una llamada para salir() en ellos. De vez en cuando, ejecuto las secuencias de comandos de forma interactiva para la depuración y el perfil, por lo general en ipython. Cuando estoy ejecutando interactivamente, quiero suprimir las llamadas para salir.

Aclaración:

Supongamos que tengo un guión, myscript.py, que se parece a:

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

A veces, quiero ejecutar el script en una sesión 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 salida() llamada causará ipython para colgar mientras que una Me pregunta si realmente quiero salir. Esta es una pequeña molestia durante la depuración (demasiado pequeña para que me importe), pero puede arruinar los resultados de los perfiles: el mensaje de salida se incluye en los resultados del perfil (dificultando 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 permite modificar mi script de lo que parece:

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

Respuesta

13

I stumbed sobre lo siguiente y que parece hacer el truco para mí:

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

¿qué pasa con el shell interactivo estándar que tienes con 'python'? – n611x007

2

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

3

Docs 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 <whatever>.

Este scripts detecta si ejecutamos interactivamente, no interactivamente y en modo post mortem (que puede atribuirse al modo interactivo si se llama al intérprete de Python usando python -i implícitamente y el usuario piensa 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." 

Se puede agregar el soporte de IPython como lo describe Mr Fooz.

+0

Esto está mal en la consola PyCharm. –

Cuestiones relacionadas