私は Django を使っていて、いつも Django シェルを使用しています。面倒なのは、Django サーバーはコードの変更時にリロードしますが、シェルはリロードしないので、テストしているメソッドを変更するたびに、シェルを終了して再起動し、必要なすべてのモジュールを再インポートし、必要なすべての変数を再初期化するなどする必要があることです。iPython の履歴により、この作業での入力が大幅に省けますが、それでも面倒です。Django 開発サーバーと同じように、Django シェルを自動リロードする方法はありますか?
reload() については知っていますが、多くのモデルをインポートし、通常はfrom app.models import *
構文を使用するため、reload() はあまり役に立ちません。
ベストアンサー1
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'
# Do changes in print_something method in x.py file.
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'
# Do changes in print_something method in x.py file.
In [3]: %load_ext autoreload
In [4]: %autoreload 2
In [5]: print_something()
Out[5]: 'Something else'
%aimport
コマンドと 3 つの自動リロード戦略を使用して、一部のインポートが更新されないようにすることも可能です。
%自動リロード
- すべてのモジュール(%aimport によって除外されたものを除く)が自動的にリロードされるようになりました。
%自動リロード 0
- 自動リロードを無効にします。
%自動リロード 1
- 入力した Python コードを実行する前に、毎回 %aimport でインポートされたすべてのモジュールをリロードします。
%自動リロード 2
- 入力した Python コードを実行する前に、毎回すべてのモジュール (%aimport によって除外されたものを除く) をリロードします。
%aimport
- 自動的にインポートされるモジュールとインポートされないモジュールを一覧表示します。
%aimport foo
- モジュール 'foo' をインポートし、%autoreload 1 で自動リロードされるようにマークします。
%aimport -foo
- モジュール 'foo' を自動リロードしないようにマークします。
これは私の用途では概ねうまく機能しますが、いくつか注意点があります:
- コード オブジェクトの置き換えは必ずしも成功するとは限りません。クラス内の @property を通常のメソッドに変更したり、メソッドをメンバー変数に変更したりすると、問題が発生する可能性があります (ただし、古いオブジェクトの場合のみ)。
- モジュールが再ロードされる前にモジュールから削除された関数 (例: モンキーパッチング経由) はアップグレードされません。
- C 拡張モジュールは再ロードできないため、自動再ロードできません。