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.