web-dev-qa-db-ja.com

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

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

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

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

317
Alain

IPythonには、いくつかの 自動再読み込み マジックが付属しています:

%load_ext autoreload
%autoreload 2

新しい行を実行する前に、変更されたすべてのモジュールを毎回リロードします。これが機能する方法は、dreloadとは少し異なります。いくつかの注意事項があります。「%autoreload?」と入力して、問題の原因を確認してください。


この設定を常に有効にしたい場合は、IPython構成ファイル~/.ipython/profile_default/ipython_config.py [1]を変更して追加します:

c.InteractiveShellApp.extensions = ['autoreload']     
c.InteractiveShellApp.exec_lines = ['%autoreload 2']

以下のコメントを介して@Kosにクレジットします。

[1] ~/.ipython/profile_default/ipython_config.pyファイルがない場合は、最初にipython profile createを呼び出す必要があります。または、ファイルは$IPYTHONDIRにあります。

451
pv.

IPython 0.12(およびそれ以前)では、これを使用できます:

%load_ext autoreload
%autoreload 2

これは基本的に pv。 による答えと同じですが、拡張子の名前が変更され、%load_extを使用してロードされる点が異なります。

24
RafG

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

18
Sven Marnach

何らかの理由で、 コードをあるノートブックから別のノートブックにインポートする の場合、%autoreloaddreloadも機能しないようです。単純なPython reloadのみが機能します。

reload(module)

[1] に基づきます。

14

これはどう:

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(私が思うに)に入れて、インタープリターを起動するたびにロードされるようにすることもできます。

3
Y.H Wong

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")
3
Pegasus

別のオプション:

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF

Ubuntu 14.04のipythonおよびipython3 v5.1.0で検証済み。

2
Chad

importlib というモジュールは、インポート内部へのアクセスを許可します。特に、関数 importlib.reload() を提供します。

import importlib
importlib.reload(my_module)

%autoreloadとは異なり、importlib.reload()はモジュールに設定されたグローバル変数もリセットします。ほとんどの場合、それはあなたが望むものです。

importlibはPython 3.1以降でのみ使用可能です。古いバージョンの場合、モジュール imp を使用する必要があります。

1
Jezz

再読み込みの標準的な方法は、IPythonを最初に開いた後、両方の方法を組み合わせることです。

from IPython.lib.deepreload import reload
%load_ext autoreload
%autoreload 2

これを行う前にモジュールをロードすると、手動のreload(module_name)を使用しても、モジュールはリロードされません。私はまだ、めったに調べていないクラスメソッドがリロードしないという不可解な問題を経験します。

1
ryanjdillon

AnacondaのJupyterノートブックで、次の操作を行います。

%load_ext autoreload
%autoreload 2

メッセージを生成しました:

自動リロード拡張機能はすでにロードされています。リロードするには、%reload_ext autoreloadを使用します

行うことが望ましいようです:

%reload_ext autoreload
%autoreload 2

バージョン情報:

ノートブックサーバーのバージョンは5.0.0で、次で実行されています:Python 3.6.2 | Anaconda、Inc. | (デフォルト、2017年9月20日、13:35:58)[MSC v.1900 32ビット(Intel)]

0