6

私は django IPython-shell で作業しています。これは で開始できますmanage.py shell。テストのためにシェルにextern関数をロードすると、すべて問題ありません。しかし、関数に変更を加えると、シェルにはまだ古いバージョンの関数が残っています。新しいインポートを行っても。

関数の実際のバージョンをリロードする方法を知っている人はいますか?

よろしくお願いします!

編集:私はWindowsを使用しています-それが違いを生む場合。

4

5 に答える 5

7

モジュールを sys.modules から削除して再読み込みし、新しいインポートを作成します。

import sys
sys.modules.pop('your.module')
import your.module
# or
from your.module import your_function
于 2012-06-18T07:43:13.823 に答える
1

目的のモジュールで組み込みの「リロード」機能を使用してみてください。

http://docs.python.org/library/functions.html?highlight=reload#reload

于 2010-10-07T17:16:32.467 に答える
1

コードをインポートする前に IPython autoreload 拡張機能を有効にします。

%load_ext autoreload
%autoreload 2

通常の django シェルで使用していますが、完全に機能しますが、いくつかの制限があります。

警告:

信頼できる方法で Python モジュールをリロードすることは、一般的に困難であり、予期しないことが起こる可能性があります。%autoreload は、モジュール内の以前の関数コード オブジェクトとクラスの一部を新しいバージョンに置き換えることで、一般的な落とし穴を回避しようとします。これにより、次のことが機能します。

  • 「xxx からのインポート foo」を介してインポートされた関数とクラスは、「xxx」がリロードされると新しいバージョンにアップグレードされます。
  • クラスのメソッドとプロパティはリロード時にアップグレードされるため、リロード前に作成されたオブジェクト「c」で「c.foo()」を呼び出すと、「foo」の新しいコードが実行されます。

既知の残りの警告の一部は次のとおりです。

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

ソース: https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#cabeats

もう 1 つの優れたオプションは、コードを別のスクリプトに記述し、次のように django シェルに送信することです。

manage.py shell < my_script.py
于 2016-10-07T14:18:16.570 に答える
0

IPython でモジュールをリロードするのに非常にうまく機能するスクリプトを作成しました。

これは、sys.modules からモジュールを削除してから再インポートする、上記の wrongite の回答の手法に基づいています。

于 2012-07-15T00:31:31.803 に答える
0

私が見つけた最も簡単な解決策は、関数を自動的にリロードする shell_plus と iPython の組み合わせです。

  1. pip インストール ipython
  2. pip install django-extensions
  3. INSTALLED_APPS に「django_extensions」を追加します
  4. python manage.py shell_plus
于 2015-12-16T10:23:01.280 に答える