web-dev-qa-db-ja.com

NameErrorを与えるリロードモジュール:名前 'reload'は定義されていません

Python 3で既にインポートしたモジュールをリロードしようとしています。一度インポートするだけで、importコマンドを再度実行しても何も起こりません。

reload(foo)を実行するとこのエラーが発生します:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

エラーはどういう意味ですか?

151
Lonnie Price

reload はPython 2に組み込まれていますが、Python 3には組み込まれていません。そのため、表示されるエラーが予想されます。

Python 3のモジュールを本当にリロードする必要がある場合は、次のいずれかを使用する必要があります。

223
Alex Martelli

> = Python3.4の場合:

import importlib
importlib.reload(module)

<= Python3.3の場合:

import imp
imp.reload(module)

Python2.xの場合:

組み込みのreload()関数を使用します。

reload(module)
78
Kevin
import imp
imp.reload(script4)
48
user57823

以前に書かれた回答を拡張するために、Pythonバージョン2および3で機能する単一のソリューションが必要な場合は、次を使用できます。

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
35
Joey Wilhelm

すべてのpythonバージョンで動作するため、次のスニペットを使用することをお勧めします(sixが必要です):

from six.moves import reload_module
reload_module(module)
11
Alleo

Python2およびpython3の互換性のために、次を使用できます。

# Python 2 and 3
from imp import reload
reload(mymodule)

外部ライブラリを使用したくない場合、1つの解決策は、以下のようにpython 3のpython 2からリロードメソッドを再作成することです。これをモジュールの上部で使用します(python 3.4以降を想定)。

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

pythonファイルを設定ファイルとして使用し、アプリケーションの再起動を避けたい場合は、BTWのリロードが非常に必要です。

1
user6830669