bagaimana modul "reimport" ke python kemudian kode diubah setelah impor

92

Saya punya foo.py

def foo():
    print "test"

Di IPython saya menggunakan:

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

Kemudian saya mengubah foo() menjadi:

def foo():
    print "test changed"

Di IPython, hasil pemanggilan masih test :

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

Kemudian saya menggunakan:

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

Saya menghapus foo.pyc di folder yang sama foo.pyada, tetapi masih tidak berhasil.

Bolehkah saya tahu cara mengimpor ulang kode yang diperbarui dalam runtime?

pengguna478514
sumber
2
Kemungkinan duplikat dari Reimport a module dengan python sementara interaktif
Praveen

Jawaban:

121

Untuk Python 2.x

reload(foo)

Untuk Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)
John La Rooy
sumber
23
Sebenarnya, cukup "muat ulang (foo)" - tidak perlu atribut ulang
jsbueno
2
Saya tidak bisa membuatnya bekerja. Saya mendapatkan TypeError: reload () argumen harus modul
Burak
2
@ Burak, Apakah argumen yang Anda berikan ke reloadmodul ?. misalnya. Anda harus melakukan import foosebelumnya
John La Rooy
27
Perhatikan bahwa jika Anda melakukannya from foo import *atau from foo import bar, simbol footidak dapat ditentukan. Anda perlu import syskemudian reload(sys.modules['foo'])atau mungkinreload(sys.modules[bar.__module__])
drevicko
3
Tolong, biarkan Python 2.x mati asp dan berhenti mendukung Python 2.x! Hitung mundur untuk penghentian python 2.x pythonclock.org .
Martijn van Wezel
66

Selain jawaban gnibbler:

Ini berubah di Python 3 menjadi:

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

Seperti yang ditunjukkan oleh @onnodb, impsudah tidak digunakan lagi importlibsejak Python 3.4:

>>> import importlib
>>> importlib.reload(foo)
danlei
sumber
5
Hanya catatan kecil: Di versi Python 3.x yang lebih baru, "imp" sudah tidak digunakan lagi dan digantikan oleh "importlib". Namun, cara kerjanya sama.
onnodb
55

IPython3 ini autoreload fitur bekerja tepat.

Saya menggunakan contoh sebenarnya dari halaman web. Pertama muat fitur 'muat otomatis'.

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

Kemudian impor modul yang ingin Anda uji:

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

Buka foo.py di editor dan ubah some_function untuk mengembalikan 43

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

Ini juga berfungsi jika Anda mengimpor fungsi secara langsung.

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

Buat perubahan di some_function untuk mengembalikan 43.

In []: some_function()
Out[]: 43
Ashfaq
sumber
1
dari foo import some_function, tidak berfungsi di bawah Jupyterlab Python 3.7.3
Robert Nowak
7

Jika Anda ingin ini terjadi secara otomatis, ada modul autoreload yang disertakan dengan iPython.

CpILL
sumber
dari foo import some_function, tidak berfungsi di bawah Jupyterlab Python 3.7.3
Robert Nowak
@Robert Nowak Saya mengalami ini, tetapi berhasil ketika saya mencoba hanya "import some_function" tanpa "dari foo" kemudian di kode saya setelah yang asli dari foo import some_function.
Michael Szczepaniak