関数 - python 再 読み込み




IPythonでサブモジュールをリロードする (6)

AnacondaのJupiterノートブックで、これをやってみましょう:

%load_ext autoreload
%autoreload 2

メッセージを出しました:

オートリロード拡張機能は既にロードされています。 それをリロードするには、以下を使用します: %reload_ext autoreload

それが望ましいと思われる:

%reload_ext autoreload
%autoreload 2

バージョン情報:

ノートブックサーバのバージョンは5.0.0で、Python 3.6.2 | Anaconda、Inc. | (デフォルト、Sep 20 2017、13:35:58)[MSC v.1900 32ビット(Intel)]

現在、私はサブモジュールを含み、numpy / scipyを使用するpythonプロジェクトに取り組んでいます。 Ipythonは、対話型コンソールとして使用されます。 残念ながら、私は現在使用しているワークフローに満足していません。私はいくつかのアドバイスを感謝します。

IPythonでは、フレームワークは簡単なimportコマンドでロードされます。 ただし、フレームワークのサブモジュールの1つでコードを変更する必要があることがよくあります。 この時点でモデルは既にロードされており、IPythonを使ってモデルとやりとりしています。

現在、フレームワークには互いに依存する多くのモジュールが含まれています。つまり、フレームワークが最初にロードされるときに、メインモジュールがサブモジュールをインポートおよびコンフィグレーションするときです。 コードの変更は、モジュールがreload(main_mod.sub_mod)を使用してreload(main_mod.sub_mod)ロードされた場合にのみ実行されます。 変更されたすべてのモジュールをフルパスで個別にリロードする必要があるので、これは面倒です。 reload(main_module)もすべてのサブモジュールをリロードしますが、numpy / scipyをリロードするのではなく、非常に便利です。


IPython 0.12では、これを使うことができます:

%load_ext autoreload
%autoreload 2

これはによる答えと本質的に同じ ただし、拡張子の名前が変更され、 %load_extを使用してロードされる%load_extます。


IPythonはすべてのサブモジュールを再帰的に再dreload()するためのdreload()を提供します。 個人的には、 %run() magicコマンドを使用することをお勧めします%run()コメントでJohn Salvatierが指摘したように、深いリロードを実行しません)。


http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/

これらのマジック関数を何度も繰り返さないようにするには、ipythonスタートアップスクリプト(.ipython / profile_default / startupの下に.py接尾辞を付けて名前をつけてください)の下にあるすべてのpythonスクリプトは字句順にロードされます。次のようになります。

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")

これはどう:

import inspect

# needs to be primed with an empty set for loaded
def recursively_reload_all_submodules(module, loaded=None):
    for name in dir(module):
        member = getattr(module, name)
        if inspect.ismodule(member) and member not in loaded:
            recursively_reload_all_submodules(member, loaded)
    loaded.add(module)
    reload(module)

import mymodule
recursively_reload_all_submodules(mymodule, set())

これは、あなたが与えるモジュールとサブモジュールのツリー全体を効果的にリロードするはずです。 この関数を.ipythonrcに入れることもできます(私は思うので)、インタープリタを起動するたびに読み込まれます。


何らかの理由で、 あるノートブックから別のノートにコードをインポートするときに%autoreloaddreloaddreloadないようです。 プレーンなPython reloadだけが動作します:

reload(module)

[1]基づいています。





ipython