Django シェルでモジュールをリロードするにはどうすればいいですか? 質問する

Django シェルでモジュールをリロードするにはどうすればいいですか? 質問する

私は 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 拡張モジュールは再ロードできないため、自動再ロードできません。

おすすめ記事