2009-07-31 7 views
6

Y at-il un moyen pour un script python de détecter automatiquement s'il est exécuté de manière interactive ou non? Alternativement, peut-on détecter si ipython est utilisé par rapport à l'exécutable c python normal? Contexte: Mes scripts python ont généralement un appel à exit() en eux. De temps en temps, je cours les scripts interactivement pour le débogage et le profilage, habituellement dans ipython. Lorsque je cours de manière interactive, je veux supprimer les appels pour quitter.Détection de l'exécution interactive d'un script python dans ipython

Précision:

Supposons que j'ai un script, myscript.py, qui ressemble à:

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

Parfois, je veux exécuter le script dans une session IPython que je l'ai déjà commencé , en disant quelque chose comme:

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

a la fin du script, l'appel exit() provoquera ipython bloqué alors qu'il a sks moi si je veux vraiment sortir. Ceci est une gêne mineure lors du débogage (trop mineur pour moi), mais cela peut gâcher les résultats de profilage: l'invite de sortie est incluse dans les résultats du profil (rendant l'analyse plus difficile si je démarre une session de profilage avant de déjeuner) .

Ce que je voudrais quelque chose qui me permet modifier mon script pour qu'il ressemble à:

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

Répondre

13

Je stumbed sur les points suivants et il semble faire l'affaire pour moi:

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

qu'en est-il du shell interactif standard que vous avez avec 'python'? – n611x007

2

Quand il est invoqué de manière interactive, Python exécuter le script en $ PYTHONSTARTUP, de sorte que vous pouvez simplement avoir cette variable d'environnement invoquer un script qui définit un

global
3

Docs disent que sys.ps1 n'existe pas en mode non-interactif. De plus, on peut utiliser sys.flags (pour python 2.6+) pour détecter si nous avons utilisé python -i <whatever>. Ce script détecte si nous fonctionnons de manière interactive, non interactive et en mode post mortem (ce qui peut être attribué au mode interactif si l'interpréteur Python est appelé en utilisant python -i implicitement et que l'utilisateur pense qu'il a atterri dans une console "interactive"):

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

Le support IPython peut être ajouté comme décrit par Mr Fooz.

+0

Ceci est faux dans la console PyCharm. –