2013-08-13 13 views
18

Utilizzando Cython, sto sviluppando un modulo di estensione che viene generato come file .so. Quindi lo provo usando IPython. Durante lo sviluppo, ho spesso bisogno di apportare modifiche e ricostruire. Devo anche uscire dalla shell IPython e reinserire tutti i comandi. Reimportare il modulo conRicaricamento di un modulo di estensione Python da IPython

import imp 
imp.reload(Extension) 

non funziona, il codice non viene aggiornato. C'è un modo per evitare il riavvio della shell IPython dopo aver ricostruito il modulo?

risposta

16

Le estensioni C non possono essere ricaricate senza riavviare il processo (per ulteriori informazioni, vedere this official Python bug).

Poiché si sta già utilizzando IPython, è consigliabile utilizzare una delle interfacce a due processini come Notebook o QtConsole, se è accettabile. Ciò consente di riavviare facilmente il processo del kernel, che consente di caricare nuovamente il modulo. Ovviamente, questo non è conveniente come ricaricare un modulo Python perché devi eseguire di nuovo lo stesso stato. Ma questo non è evitabile, quindi il punto è di attenuare l'inconveniente.

trovo interfacciare il notebook il più conveniente per lo sviluppo di estensioni, in quanto fornisce il modo più semplice per tornare allo stesso stato:

  1. ricostruire l'estensione
  2. kernel riavvio
  3. Run All to rieseguire il notebook

e si ritorna allo stesso stato con la nuova versione dell'estensione. Il chilometraggio può variare, a seconda di quanto è costoso riprendere il lavoro interattivo, ma mi è stato utile.

0

È possibile provare a impostare uno autoreload nello ipython shell, documentation here.

Set autoreload

In [1]: %load_ext autoreload 

In [2]: %autoreload 2 

Situato autoreload sul modulo specifico

%aimport foo 

Inoltre, dare un'occhiata a dreload (più su dreloadhere) e il run-magic

+4

Non funziona per il mio caso, la documentazione di autoregolazione afferma che: "I moduli di estensione C non possono essere ricaricati e quindi non possono essere ricaricati automaticamente". – clstaudt

-2

IPython fornisce un modo per automatically reload modules:

In [1]: %load_ext autoreload 
In [2]: %autoreload 2 

altro si può utilizzare (a cura: python 2 solo)

reload(module) 

Vedi this answer per python3 ricarica.

+0

Umoristico, hai risposto 5 secondi dopo di me. Molto bello quando succede. – enginefree

+0

'reload' non è un built-in in Python 3, credo. – clstaudt

+0

: x avrei reindirizzato a questa [domanda] (http: // StackOverflow.it/questions/5364050/reloading-submodules-in-ipython) ma non ho familiarità con il sistema @cls: oups, my bad – Laurent

Problemi correlati