Ho degli script Python che usano il trucco if __name__ == '__main__'
per fare in modo che il codice venga eseguito solo quando lo script viene chiamato come script e non quando viene caricato nell'interprete interattivo. Tuttavia, quando modifico questi script da IPython usando il comando %edit
, IPython apparentemente imposta __name__
su '__main__'
e così il codice viene eseguito ogni volta che esco dalla sessione di modifica. C'è un buon modo per rendere questo codice non eseguito quando il modulo viene modificato da IPython?if __name__ == '__main__' in IPython
risposta
Quando si lavora all'interno di Emacs (che presumo è vicino a quello che si ottiene con %edit
), io di solito uso questo trucco:
if __name__ == '__main__' and '__file__' in globals():
# do what you need
Per ovvie ragioni, __file__
è definita solo per import
'eD moduli, e non per shell interattiva.
IPython aggiunge la funzione get_ipython()
alle variabili globalmente disponibile. Così è possibile verificare, se questa funzione esiste in globals()
per rendere la vostra decisione:
if __name__ == '__main__' and "get_ipython" not in dir():
print "I'm not loaded with IPython"
Il codice precedente verifica solo se v'è una variabile globale con nome get_ipython
. Per verificare inoltre se questa variabile è invocabile, si può fare:
if __name__ == '__main__' and not callable(globals().get("get_ipython", None)):
print "I'm not loaded with IPython"
Sembra che si potrebbe solo bisogno l'interruttore -x
:
In [1]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_J8j9Wl.py
Editing... done. Executing edited code...
Name is main -- executing
Out[1]: "if __name__ == '__main__':\n print 'Name is main -- executing'\n"
In [2]: %edit -x /tmp/ipython_edit_J8j9Wl
Editing...
Quando si chiama %edit -x
il codice non viene eseguito dopo si esce il tuo editore
che 'interruttore -x' è cruciale. –
Grazie; questo è utile, ma non fa ciò che voglio perché voglio che IPython carichi le funzioni/classi definite nel modulo, ma non eseguo il codice di test associato al modulo. –
Nessun problema. Pensavo avessi qualche chiarimento come questo. Personalmente raccomanderei la risposta di @ ffriend alla luce di questo. –
IPython esegue automaticamente il codice che si scrive con il comando %edit
. È possibile utilizzare %edit -x
per specificare che NON si desidera eseguire il codice che stavi modificando.
http://ipython.org/ipython-doc/stable/api/generated/IPython.core.magics.code.html
Per coloro che non sono a conoscenza del fatto che i quaderni Jupyter sono stati sviluppati da quaderni IPython, farò notare che l'aggiunta della seconda parte funziona nei taccuini Jupyter in modo che il blocco di codice pertinente non venga eseguito quando viene incollato nella cella di un notebook. Inoltre, coloro che lo considerano potrebbero essere interessati all'approccio in evidenza [qui] (https://stackoverflow.com/a/22424821/8508004). – Wayne