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


162

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

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

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

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

回答:


239

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

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


37
この答えは、Python 3でモジュールをリロードすることは悪いように思われます。これの背後にある考えは何ですか?
ABM 2016年

11
再読み込みには常に問題があります。リロードするとモジュール変数は更新されますが、古い変数は削除されないため、何かの名前を変更しても古い名前はそのまま残ります。クラス定義を変更しても、既存のオブジェクトは古いタイプのままです。最後に、一部のモジュールは、インポート時に2回実行するように設計されていないコードを実行します。したがって、リロードを回避することをお勧めしますが、多くの場合非常に便利です。
エヴァン

13
それはしばしば問題があると言いますが、常にではありませ。確かreloadに、スクリプトへの書き込みの有効な使用例は非常にまれであり、そのようなダークアートを採用している人はこのコメントを読んでいる可能性は低いと思います。ただし、モジュールを開発し、IPythonコンソールを使用してインタラクティブにテストする場合reloadは、そのワークフローで便利です。ただし、@ Evanが言ったように、インポート時の副作用に注意してください。一般に、私はreload他人のモジュールを使わないように言います。 reload設計時に自分自身を使用することは理にかなっています。
Tim D

6
私は仕事にJupyter Notebookを使用しており、物事を整理するために、最小限の修正が必要な作業をインポート可能なパッケージに入れています。ただし、これらの処理には修正が必要な場合があり、私のノートブックカーネルは文字通り、計算に1日を費やしていたメモリ計算を保持しているため、リロードは完全に正しいことです。
スコット

再読み込みは、データベース関数など、時間のかかる呼び出しを伴うライブラリの積極的な開発に不可欠です。ただし、モジュールの再読み込みで発生する可能性がある主な問題の1つは、デコレータを使用した関数が適切に再読み込みされない傾向があることです
Alexander McFarlane

82

> = Python3.4の場合:

import importlib
importlib.reload(module)

Python3.3以下の場合:

import imp
imp.reload(module)

Python2.xの場合:

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

reload(module)

48
import imp
imp.reload(script4)

7
Python 3.4以降非推奨- importlib代わりに使用してください。
Mark Amery

39

以前に書かれた回答を拡張するために、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

12

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

from six.moves import reload_module
reload_module(module)

2

python2とpython3の互換性のために、以下を使用できます。

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

1
これはPython 3.7(およびそれ以前)で機能しますが、@ Alex Martelliが以下に書いたように価格は低くなっています。Alleoの回答「from six.moves import reload_module」を使用してください
Charles Plager

2

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.