18

私はipythonが大好きですが、%runに問題があることを発見しました。%runが繰り返し呼び出されると、インポートされたモジュールがリロードされません。

ファイルex1.pyに次の行が含まれているとします。

import ex2
ex2.x.append(1)
print ex2.x

また、ファイルex2.pyには次のものが含まれています。

x = []

これで、コマンドラインからpython ex1.pyを実行すると、毎回[1]が繰り返し出力されます。ただし%run ex1.py、ipython内から呼び出すと、[1]、[1,1]、[1,1,1]などが繰り返し出力されます。これは、モジュールex2.pyがリロードされないためです。したがって、問題があります。ipythonrun-scriptプロトコルは、「実世界」の動作を反映していません。

ノート:

%load_ext autoreload
%autoreload 2

助けにはなりませ。これらの行は、ex2.pyファイルに変更が加えられた場合にのみex2.pyが再ロードされます。変更を加えない場合、またはex1.pyにのみ変更を加える場合、望ましくない動作が発生します。

ここで%runをコマンドラインのように動作させる方法はありますか?これは、スクリプトのテスト環境としてipythonを使用することの実際の欠陥のようです。(または、おそらく道徳は、モジュールが別のモジュールの名前空間に書き込んではいけないということですか?)

4

2 に答える 2

11

%run ex1.py(またはそのことに関するスクリプト)は、autoreload拡張機能が2に設定されていても、インポートされたモジュールのディープリロードを実行しません。これは、%runipythonでのコマンドの動作の「欠陥」です。

明示的に呼び出す必要があります

dreload(ex2)

再度実行する前に、ディープリロードを実行%run ex1.pyします。

参照-http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

将来、ディープリロードを自動的に実行する計画がある可能性があり%runます。この問題は、この記事の執筆時点ではまだ未解決の問題であり、ユーザーから提案されています-https://github.com/ipython/ipython/問題/461

于 2012-10-31T03:07:31.960 に答える
6

私は同じ問題に遭遇しています。これは、ipython の run コマンドの望ましくない影響のように思えます。インポートされたモジュールをリロードしません。

著者は正しいです: ex2.py に変更が加えられた場合、次のコマンドはリロードに役立ちます

%load_ext autoreload
%autoreload 2

回避するための私の最も簡単な方法は、インポートされたモジュール(この例では ex2.py) を毎回変更し、ipython で次のコマンドを実行することです。

%load_ext autoreload
%autoreload 2
%run ex1.py

これにより、ex2.py のリロードが容易になります。

上記の 3 行を実行する前に、毎回 ex2.py を変更する必要があることに注意してください。モジュール ex2 をリロードできるのは、この方法だけです。

于 2013-11-18T17:04:41.927 に答える