Pregunta

¿Hay alguna manera para que un script de Python detecte automáticamente si se ejecuta de forma interactiva o no? Alternativamente, ¿se puede detectar si se está utilizando ipython frente al ejecutable c python normal?

Antecedentes: mis scripts de Python generalmente tienen una llamada para salir () 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 interactivamente, 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 del script, la llamada a exit () hará que ipython se cuelgue mientras me pregunta si realmente quiero salir. Esta es una molestia menor durante la depuración (demasiado pequeña para que me importe), pero puede estropear los resultados de la creación de perfiles: el mensaje 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 así:

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

Solución

Me topé con lo siguiente y parece hacer el truco para mí:

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

Otros consejos

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

Este script detecta si corremos de forma interactiva, no interactiva 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 cree que aterrizó en " " 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 puede hacer que esa variable de entorno invoque un script que establece un global

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top