2009-07-31 16 views
6

Gibt es eine Möglichkeit für ein Python-Skript automatisch zu erkennen, ob es interaktiv ausgeführt wird oder nicht? Kann man alternativ feststellen, ob Ipython im Gegensatz zur normalen C-Python-Programmdatei verwendet wird?Erkennen, wenn ein Python-Skript interaktiv in Ipython ausgeführt wird

Hintergrund: Meine Python-Skripte haben in der Regel einen Aufruf von exit() in ihnen. Von Zeit zu Zeit starte ich die Skripte interaktiv zum Debuggen und Profiling, normalerweise in ipython. Wenn ich interaktiv laufe, möchte ich die Anrufe zum Beenden unterdrücken.

Klärung:

Angenommen, ich habe ein Skript, myscript.py, die wie folgt aussieht:

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

Manchmal möchte ich das Skript innerhalb einer IPython Sitzung ausgeführt, die ich bereits begonnen haben, und sagte so etwas wie:

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

Am Ende des Skripts wird die exit() Aufruf verursacht ipython, während es hängen ein sks mich, wenn ich wirklich aussteigen will. Dies ist eine kleine Belästigung während des Debuggens (zu unbedeutend für mich), aber es kann zu Profiling-Ergebnissen führen: Die Exit-Eingabe wird in die Profilergebnisse aufgenommen (erschwert die Analyse, wenn ich vor dem Mittagessen eine Profiling-Sitzung starte) .

Was würde Ich mag ist etwas, das ich mein Skript ändern kann, so dass es wie folgt aussieht:

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

Antwort

13

I setzt auf den folgenden stumbed und es scheint mir, den Trick zu tun:

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

Was ist mit der Standard interaktiven Shell, die Sie mit 'Python' haben? – n611x007

2

Wenn interaktiv aufgerufen, Python wird das Skript in $ PYTHON läuft, so dass Sie einfach, dass die Umgebungsvariable haben könnten rufen ein Skript, das eine globale

3

Docs sagen, dass sys.ps1 existiert nicht im nicht interaktiven Modus. Zusätzlich kann man sys.flags (für Python 2.6+) verwenden, um festzustellen, ob wir python -i <whatever> verwendet haben.

diese Skripte erkennt, wenn wir interaktiv, nicht interaktiv und in post-mortem-Modus (die in dem interaktiven Modus zurückgeführt werden können, wenn Python-Interpreter aufgerufen wird python -i implizit und Benutzer denkt, dass er in „interaktiv“ Konsole gelandet) laufen:

#!/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-Unterstützung kann wie von Herrn Fooz beschrieben hinzugefügt werden.

+0

Dies ist in der PyCharm-Konsole falsch. –

Verwandte Themen