IPython自動リロード拡張機能を使用することをお勧めします。
./manage.py shell
In [1]: %load_ext autoreload
In [2]: %autoreload 2
そして今から、インポートされたすべてのモジュールは評価前に更新されます。
In [3]: from x import print_something
In [4]: print_something()
Out[4]: 'Something'
In [5]: print_something()
Out[5]: 'Something else'
%load_ext autoreload
コマンドの前に何かがインポートされた場合にも機能します。
./manage.py shell
In [1]: from x import print_something
In [2]: print_something()
Out[2]: 'Something'
In [3]: %load_ext autoreload
In [4]: %autoreload 2
In [5]: print_something()
Out[5]: 'Something else'
%aimport
コマンドと3つの自動リロード戦略を使用して、一部のインポートが更新されないようにすることもできます。
%autoreload
- すべてのモジュール(%aimportによって除外されたモジュールを除く)を自動的にリロードします。
%autoreload 0
%autoreload 1
- 入力したPythonコードを実行する前に、%aimportでインポートされたすべてのモジュールを毎回リロードします。
%autoreload 2
- 入力したPythonコードを実行する前に、毎回すべてのモジュール(%aimportで除外されたモジュールを除く)をリロードします。
%aimport
- 自動的にインポートされるモジュールまたはインポートされないモジュールを一覧表示します。
%aimport foo
- モジュール 'foo'をインポートし、%autoreload1に対して自動リロードされるようにマークします。
%aimport -foo
- モジュール 'foo'を自動リロードしないようにマークします。
これは一般的に私の使用には適していますが、いくつかの洞窟があります。
- コードオブジェクトの置き換えは常に成功するとは限りません。クラスの@propertyを通常のメソッドに変更したり、メソッドをメンバー変数に変更したりすると、問題が発生する可能性があります(ただし、古いオブジェクトの場合のみ)。
- 再ロードされる前にモジュールから(たとえば、モンキーパッチを介して)削除された関数はアップグレードされません。
- C拡張モジュールはリロードできないため、自動リロードできません。