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.