it-swarm.com.de

Wie man das Modul nach python importiert, dann wird der Code nach dem Import geändert

Ich habe einen foo.py

def foo():
    print "test"

In IPython verwende ich:

In [6]:  import foo
In [7]:  foo.foo()
test

Dann habe ich die foo() geändert zu:

def foo():
    print "test changed"

In IPython lautet das Ergebnis für den Aufruf immer noch test:

In [10]:  import foo
In [11]:  foo.foo()
test

Dann benutze ich:

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test

Ich lösche den foo.pyc Im selben Ordner, foo.py Existiert, aber immer noch kein Glück.

Kann ich den aktualisierten Code zur Laufzeit erneut importieren?

70
user478514

Für Python 2.x

reload(foo)

Für Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)
93
John La Rooy

Neben der Antwort von Gnibbler:

Dies änderte sich in Python 3 zu:

>>> import imp
>>> imp.reload(foo)

Wie @onnodb betont, wird imp zugunsten von importlib abgelehnt, da Python 3.4:

>>> import importlib
>>> importlib.reload(foo)
62
danlei

Die Funktion Autoreload von IPython3 funktioniert genau richtig.

Ich verwende das aktuelle Beispiel von der Webseite. Laden Sie zuerst die 'Autoreload'-Funktion.

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

Importieren Sie dann das zu testende Modul:

In []: import foo
In []: foo.some_function()
Out[]: 42

Öffnen Sie foo.py in einem Editor und ändern Sie some_function so, dass 43 zurückgegeben wird

In []: foo.some_function()
Out[]: 43

Es funktioniert auch, wenn Sie die Funktion direkt importieren.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Nehmen Sie in some_function eine Änderung vor, um 43 zurückzugeben.

In []: some_function()
Out[]: 43
41
Ashfaq

Wenn dies automatisch geschehen soll, gibt es das mit iPython gelieferte Modul Autoreload .

4
CpILL