現在、サブモジュールを含み、numpy/scipyを使用するpythonプロジェクトに取り組んでいます。 Ipythonは対話型コンソールとして使用されます。残念ながら、現在使用しているワークフローにあまり満足していません。アドバイスをいただければ幸いです。
IPythonでは、フレームワークは単純なimport
コマンドによってロードされます。ただし、フレームワークのサブモジュールの1つでコードを変更する必要がしばしばあります。この時点でモデルはすでにロードされており、IPythonを使用してモデルと対話します。
現在、フレームワークには相互に依存する多くのモジュールが含まれています。つまり、フレームワークが最初にロードされるとき、メインモジュールはサブモジュールをインポートおよび構成しています。コードへの変更は、モジュールがreload(main_mod.sub_mod)
を使用してリロードされた場合にのみ実行されます。フルパスを使用して、変更されたすべてのモジュールを個別にリロードする必要があるため、これは面倒です。 reload(main_module)
もすべてのサブモジュールをリロードし、numpy/scipyをリロードしないと非常に便利です。
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
にあります。
IPython 0.12(およびそれ以前)では、これを使用できます:
%load_ext autoreload
%autoreload 2
これは基本的に pv。 による答えと同じですが、拡張子の名前が変更され、%load_ext
を使用してロードされる点が異なります。
何らかの理由で、 コードをあるノートブックから別のノートブックにインポートする の場合、%autoreload
もdreload
も機能しないようです。単純なPython reload
のみが機能します。
reload(module)
[1] に基づきます。
これはどう:
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(私が思うに)に入れて、インタープリターを起動するたびにロードされるようにすることもできます。
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")
別のオプション:
$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF
Ubuntu 14.04のipythonおよびipython3 v5.1.0で検証済み。
importlib
というモジュールは、インポート内部へのアクセスを許可します。特に、関数 importlib.reload()
を提供します。
import importlib
importlib.reload(my_module)
%autoreload
とは異なり、importlib.reload()
はモジュールに設定されたグローバル変数もリセットします。ほとんどの場合、それはあなたが望むものです。
importlib
はPython 3.1以降でのみ使用可能です。古いバージョンの場合、モジュール imp
を使用する必要があります。
再読み込みの標準的な方法は、IPython
を最初に開いた後、両方の方法を組み合わせることです。
from IPython.lib.deepreload import reload
%load_ext autoreload
%autoreload 2
これを行う前にモジュールをロードすると、手動のreload(module_name)
を使用しても、モジュールはリロードされません。私はまだ、めったに調べていないクラスメソッドがリロードしないという不可解な問題を経験します。
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)]