モジュールをPythonに「再インポート」し、インポート後にコードを変更する方法


92

私は foo.py

def foo():
    print "test"

IPythonでは次のものを使用します。

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

次に、foo()を次のように変更しました。

def foo():
    print "test changed"

IPythonでは、呼び出しの結果はtest次のとおりです。

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

それから私は使用します:

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

foo.pyc同じフォルダにあるものを削除しますfoo.pyが、それでも運がありません。

実行時に更新されたコードを再インポートする方法を教えてもらえますか?


回答:


121

Python2.xの場合

reload(foo)

Python3.xの場合

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

23
実際には、単に「リロード(FOO)」 -再属性もする必要はありません
jsbueno

2
私はそれを動かすことができませんでした。TypeErrorを取得しています:reload()引数はモジュールである必要があります
Burak

2
@Burak、あなたがreloadモジュールに渡している引数はありますか?例えば。import foo事前に行う必要があります
John La Rooy 2012年

27
from foo import *またはを実行した場合from foo import bar、シンボルfooは定義されないことに注意してください。あなたはimport sysそれからreload(sys.modules['foo'])または多分する必要がありますreload(sys.modules[bar.__module__])
drevicko 2013年

3
Python 2.xを死なせてPython2.xのサポートをやめてください!python 2.xpythonclock.orgの廃止のカウントダウン。
Martijn vanWezel19年

66

gnibblerの答えに加えて:

これはPython3で次のように変更されました。

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

@onnodbが指摘しimpているようにimportlib、Python 3.4以降、非推奨になりました。

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

5
ちょっとした補足:Python 3.xの新しいバージョンでは、「imp」は非推奨になり、「importlib」が優先されます。ただし、同じように機能します。
onnodb 2015年

56

IPython3の自動リロード機能は適切に機能します。

私はウェブページからの実際の例を使用しています。まず、「自動リロード」機能をロードします。

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

次に、テストするモジュールをインポートします。

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

エディターでfoo.pyを開き、some_functionを変更して43を返します。

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

関数を直接インポートした場合にも機能します。

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

some_functionを変更して、43を返します。

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

1
FOOインポートsome_functionから、JupyterlabのPython 3.7.3の下で働いて働いていない
ロバート貰える

7

これを自動的に実行したい場合は、iPythonに付属の自動リロードモジュールがあります。


FOOインポートsome_functionから、JupyterlabのPython 3.7.3の下で働いて働いていない
ロバート貰える

@Robert Nowakこれに遭遇しましたが、元のfrom foo import some_functionの後で、コードの後半で「from foo」を使用せずに、「importsome_function」だけを試したときに機能しました。
MichaelSzczepaniak20年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.