101

私は Django を使用しており、常に Django シェルを使用しています。煩わしい部分は、コードの変更時に Django サーバーがリロードする間、シェルはリロードしないため、テスト中のメソッドに変更を加えるたびに、シェルを終了して再起動し、すべてのモジュールを再インポートする必要があることです。必要なすべての変数を再初期化するなど. django開発サーバーと同じように、djangoシェルを自動リロードする方法はありますか?

reload() については知っていますが、多くのモデルをインポートし、通常はfrom app.models import *構文を使用するため、reload() はあまり役に立ちません。

4

11 に答える 11

95

IPython autoreload extensionを使用することをお勧めします。

./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 つの autoreload 戦略を使用して、一部のインポートが更新されないようにすることもできます。

%autoreload

  • すべてのモジュール (%aimport によって除外されたものを除く) が自動的に再ロードされるようになりました。

%オートリロード 0

  • 自動リロードを無効にします。

%自動リロード 1

  • 入力した Python コードを実行する前に、毎回 %aimport でインポートされたすべてのモジュールを再読み込みします。

%オートリロード 2

  • 入力した Python コードを実行する前に、すべてのモジュール (%aimport によって除外されたものを除く) を毎回再読み込みします。

%aインポート

  • 自動的にインポートされるモジュール、またはインポートされないモジュールを一覧表示します。

%aimport foo

  • モジュール 'foo' をインポートし、%autoreload 1 で自動再ロードされるようにマークします。

%aimport -foo

  • モジュール 'foo' を自動リロードしないようにマークします。

これは通常、私の使用には適していますが、いくつか注意事項があります。

  • コード オブジェクトの置換は常に成功するとは限りません。クラス内の @property を通常のメソッドに変更したり、メソッドをメンバー変数に変更すると、問題が発生する可能性があります (ただし、古いオブジェクトのみ)。
  • 再ロードされる前にモジュールから削除された機能 (モンキー パッチなどによって) はアップグレードされません。
  • C 拡張モジュールは再ロードできないため、自動再ロードできません。
于 2016-12-14T15:24:38.147 に答える
48

それに対する私の解決策は、コードを書いてファイルに保存してから使用することです:

python manage.py シェル < test.py

したがって、修正しようとしているものが修正されるまで、変更を加えて保存し、そのコマンドを再度実行できます。

于 2014-11-06T03:20:20.327 に答える
35

django-extensionsプロジェクトが提供する manage.py shell_plus コマンドを見てください。シェルの起動時にすべてのモデル ファイルをロードします。変更を自動リロードしますが、終了する必要はありません。そこで直接呼び出すことができます

于 2013-05-25T01:17:48.780 に答える
25

このトピックに関する一般的なコンセンサスは、python reload() がうまくいかず、これを行う良い方法がないということです。

于 2010-09-28T20:32:49.577 に答える
8

ipython 構成で shell_plus を使用します。これは、autoreloadshell_plus が何かを自動的にインポートする前に有効になります。

pip install django-extensions
pip install ipython
ipython profile create

ipython プロファイルを編集します ( ~/.ipython/profile_default/ipython_config.py):

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

シェルを開きます - 含める必要がないことに注意してください--ipython:

python manage.py shell_plus

SHELL_PLUS_PRE_IMPORTSor SHELL_PLUS_POST_IMPORTS( docs )で定義されたものはすべて自動再読み込みされます!

ファイルを保存するときにシェルがデバッガー (例pdb.set_trace()) にある場合、リロードを妨げる可能性があることに注意してください。

于 2019-04-26T14:33:35.037 に答える
5

Reload() は、いくつかのトリックがないと Django シェルでは機能しません。このスレッドと私の回答を具体的に確認できます。

「manage.pyシェル」を介してインタラクティブインタープリターを使用して、Djangoモデルモジュールをどのようにリロードしますか?

于 2010-09-22T20:50:13.997 に答える
1

あなたが望むものとはまったく異なりますが、私は今、テストや物事をいじるために自分で管理コマンドを作成する傾向があります.

コマンドでは、必要な方法で一連のローカルをセットアップし、その後対話型シェルにドロップできます。

import code

class Command(BaseCommand):
  def handle(self, *args, **kwargs):
     foo = 'bar'
     code.interact(local=locals())

リロードはありませんが、django の機能をインタラクティブにテストするための簡単で煩わしくない方法です。

于 2013-12-11T08:06:22.373 に答える
1

Django シェルからコマンドを実行する代わりに、そのように管理コマンドをセットアップして、毎回再実行することができます。

于 2013-12-03T09:48:57.677 に答える