Domanda

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

Sfondo: i miei script Python generalmente hanno una chiamata a exit () in essi. Di tanto in tanto, eseguo gli script in modo interattivo per il debug e la profilazione, di solito in ipython. Quando corro in modo interattivo, voglio sopprimere le chiamate per uscire.

Chiarimento :

Supponiamo di avere uno script, myscript.py, che assomigli a:

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

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

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

Alla fine dello script, la chiamata exit () farà bloccare ipython mentre mi chiede se voglio davvero uscire. Questo è un piccolo fastidio durante il debug (troppo piccolo per me da curare), ma può incasinare i risultati della profilazione: il prompt di uscita viene incluso nei risultati del profilo (rendendo più difficile l'analisi se inizio una sessione di profilazione prima di andare a pranzo) .

Quello che mi piacerebbe è qualcosa che mi permetta di modificare il mio script in modo che appaia:

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

Soluzione

Mi sono imbattuto in quanto segue e sembra fare il trucco per me:

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

Altri suggerimenti

I documenti 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-mortem (che può essere attribuito alla modalità interattiva se l'interprete di Python viene chiamato usando implicitamente python -i e l'utente pensa di essere arrivato tra " interattivo " console):

#!/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 di IPython può essere aggiunto come descritto da Mr Fooz.

Quando invocato in modo interattivo, python eseguirà lo script in $ PYTHONSTARTUP, quindi potresti semplicemente fare in modo che quella variabile d'ambiente invochi uno script che imposta un globale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top