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?


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)

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)

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.