Wie man das Modul wieder in Python importiert und dann den Code nach dem Import ändert

86

Ich habe ein foo.py

def foo():
    print "test"

In IPython verwende ich:

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

Dann habe ich das geändert foo()in:

def foo():
    print "test changed"

In IPython lautet das Ergebnis für den Aufruf weiterhin 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.pycim selben Ordner foo.pyvorhandenen, aber immer noch kein Glück.

Darf ich wissen, wie ich den aktualisierten Code zur Laufzeit erneut importieren kann?

user478514
quelle

Antworten:

112

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)
John La Rooy
quelle
23
Eigentlich nur "reload (foo)" - keine Notwendigkeit, es neu zuzuordnen
jsbueno
2
Ich konnte es nicht zum Laufen bringen. Ich bekomme TypeError: reload () Argument muss Modul sein
Burak
2
@ Burak, ist das Argument, das Sie an reloadein Modul übergeben?. z.B. Sie sollten im import fooVoraus tun
John La Rooy
27
Beachten Sie , wenn Sie getan haben from foo import *oder from foo import bardas Symbol foonicht definiert erhalten. Sie müssen import sysdann reload(sys.modules['foo'])oder vielleichtreload(sys.modules[bar.__module__])
Drevicko
3
Bitte lassen Sie Python 2.x sterben und hören Sie auf, Python 2.x zu unterstützen! Ein Countdown für den Ruhestand von Python 2.x pythonclock.org .
Martijn van Wezel
65

Zusätzlich zu Gnibblers Antwort:

Dies änderte sich in Python 3 zu:

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

Wie @onnodb hervorhebt, impwird importlibseit Python 3.4 veraltet :

>>> import importlib
>>> importlib.reload(foo)
danlei
quelle
5
Nur eine kleine Randnotiz: In späteren Versionen von Python 3.x ist "imp" zugunsten von "importlib" veraltet. Funktioniert aber genauso.
Onnodb
51

Die Autoreload- Funktion von IPython3 funktioniert genau richtig.

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

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 in return 43

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 eine Änderung in some_function vor, um 43 zurückzugeben.

In []: some_function()
Out[]: 43
Ashfaq
quelle
1
von foo importiere some_function, funktioniert nicht unter Jupyterlab Python 3.7.3
Robert Nowak
6

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

CpILL
quelle
von foo importiere some_function, funktioniert nicht unter Jupyterlab Python 3.7.3
Robert Nowak