modülü python'a "yeniden içe aktarma", ardından içe aktarmadan sonra kod değiştirilebilir


92

Bende var foo.py

def foo():
    print "test"

IPython'da kullanıyorum:

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

Sonra şu şekilde değiştirdim foo():

def foo():
    print "test changed"

IPython'da, çağırmanın sonucu hala test:

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

Sonra kullanırım:

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

Ben silmek foo.pyciçinde aynı klasör foo.pyhala şans var, ancak.

Güncellenen kodu çalışma zamanında nasıl yeniden içe aktaracağımı öğrenebilir miyim?


Yanıtlar:


121

Python 2.x için

reload(foo)

Python 3.x için

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

23
Aslında, sadece "yeniden yükle (foo)" - onu yeniden ilişkilendirmeye gerek yok
jsbueno

2
Çalışamıyorum. TypeError'a geçiyorum: reload () argümanı modül olmalı
Burak

2
@Burak, reloadbir modüle ilettiğiniz argüman mı ? Örneğin. Sen yapması gereken import fooönceden
John La Rooy

27
Yaptıysanız from foo import *veya from foo import barsembolün footanımlanmadığını unutmayın. Buna gerek import syso zaman reload(sys.modules['foo'])ya da belkireload(sys.modules[bar.__module__])
drevicko

3
Lütfen, Python 2.x'in asp ölmesine izin verin ve Python 2.x'i desteklemeyi bırakın! Python 2.x pythonclock.org'un emekli olması için geri sayım .
Martijn van Wezel

66

Gnibbler'in cevabına ek olarak:

Bu, Python 3'te şu şekilde değiştirildi:

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

@Onnodb'un işaret ettiği gibi, Python 3.4'ten bu yana impkullanımdan kaldırıldı importlib:

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

5
Küçük bir not: Python 3.x'in sonraki sürümlerinde "imp", "importlib" lehine kullanımdan kaldırılmıştır. Yine de aynı şekilde çalışır.
onnodb

56

IPython3'ün otomatik yeniden yükleme özelliği tam olarak çalışır.

Web sayfasındaki gerçek örneği kullanıyorum. Önce 'otomatik yeniden yükleme' özelliğini yükleyin.

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

Ardından test etmek istediğiniz modülü içe aktarın:

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

Bir düzenleyicide foo.py açın ve some_function değerini 43 döndürmek için değiştirin

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

Ayrıca işlevi doğrudan içe aktarırsanız da çalışır.

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

43'ü döndürmek için bir_işlevde değişiklik yapın.

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

1
foo import some_function, Jupyterlab Python 3.7.3 altında çalışmıyor
Robert Nowak

7

Bunun otomatik olarak gerçekleşmesini istiyorsanız, iPython ile birlikte gelen otomatik yeniden yükleme modülü vardır.


foo import some_function, Jupyterlab Python 3.7.3 altında çalışmıyor
Robert Nowak

@Robert Nowak Bununla karşılaştım, ancak foo import some_function'dan sonra kodumda daha sonra "from foo" olmadan sadece "import some_function" denediğimde çalıştı.
Michael Szczepaniak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.