2009-07-31 11 views
6

C'è un modo per uno script Python per rilevare automaticamente se viene eseguito in modo interattivo o no? In alternativa, si può rilevare se viene utilizzato ipython rispetto al normale eseguibile di python?Rilevare quando uno script python viene eseguito in modo interattivo in ipython

Background: I miei script Python hanno generalmente una chiamata a exit() in essi. Di tanto in tanto, eseguo gli script in modo interattivo per il debug e il profiling, di solito in ipython. Quando sono in esecuzione in modo interattivo, voglio sopprimere le chiamate per uscire.

Chiarimento:

Supponiamo che io sono uno script, myscript.py, che assomiglia:

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

A volte, voglio eseguire lo script all'interno di una sessione IPython che ho già iniziato , dicendo qualcosa del tipo:

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

alla fine dello script, la chiamata exit() causerà ipython bloccato mentre un sks me se voglio davvero uscire. Questo è un fastidio minore durante il debug (troppo piccolo per me per preoccuparmene), ma può rovinare i risultati del profilo: il prompt di uscita viene incluso nei risultati del profilo (rendendo l'analisi più difficile se avvio una sessione di profilazione prima di andare a pranzo) .

Quello che mi piacerebbe è una cosa che mi permetta modificare il mio script in modo che assomiglia a:

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

risposta

13

ho stumbed sul seguente e sembra fare il trucco per me:

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

E la shell interattiva standard che hai con 'python'? – n611x007

2

Quando viene invocato in modo interattivo, pitone verrà eseguito lo script in $ PYTHONSTARTUP, così si potrebbe semplicemente avere quella variabile d'ambiente richiamare uno script che imposta un globale

3

Docs dicono che sys.ps1 non esiste in modalità non interattiva. Inoltre, si può usare sys.flags (per python 2.6+) per rilevare se abbiamo usato python -i <whatever>.

Questo script rileva se eseguiamo in modo interattivo, non interattivo e in modalità post-morte (che può essere attribuito alla modalità interattiva se l'interprete python viene chiamato utilizzando python -i implicitamente e l'utente pensa di essere atterrato nella console "interattiva"):

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

Il supporto IPython può essere aggiunto come descritto da Mr Fooz.

+0

Questo è sbagliato nella console PyCharm. –

Problemi correlati