2011-04-26 3 views
9

Pythonプログラムを書くときやデバッグするときは、実行することなく機能を直接検査できるように-iコマンドラインスイッチを使用するのが本当に好きです始まりから終わりまでのすべて。Pythonソースファイルを "python -i"でインタラクティブに解釈するとき

私はコードを変更するたびに、私が定義した可能性があるすべての一時変数を失って、私のインタラクティブセッションを閉じて再起動する必要があります。 ソースファイルをPythonインタプリタからリロードするにはどうしたらいいですか?


それは、このために作られたように、組み込み関数reloadに見えますが、私は唯一という名前のモジュールでそれを使用することができます:私が代わりに最初のリロードでfrom my_prog import *を行うに場合、ただし

>> import my_prog 
>> print my_prog.x 
-- prints an error, because x is not defined -- 

-- edited my_prog.py to add the x global now... 
>> reload(my_prog) 
>> print my_prog.x 
-- prints x 

動作せず、インポートをやり直すことも効果がありません。

答えて

12

これは、Pythonがモジュールをキャッシュする方法と関係があります。再ロードのために渡すモジュールオブジェクトが必要であり、importコマンドを繰り返す必要があります。たぶん私は、一般的に使用するものがより良い方法ですが、ここにあります:

>> import my_prog 
>> from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
*** Run some code and debug *** 
>> reload(my_prog); from my_prog import * 
+0

簡潔に認められています。 – hugomg

+0

ありがとう! @smaplebiasはより細かい詳細に興味のある人のためのより完全な記述を持っています。私の+1。 –

+0

Heh、ありがとうCarl :-)後で+1。 – samplebias

10

あなたはあなたはとてもreload()は、これらのグローバルシンボル、唯一のモジュールレベルの属性を変更することはできません、通訳者のグローバルスコープにシンボルを引っ張っているfrom my_prog import *使用モジュールが再コンパイルされ再ロードされると変更されます。例えば

myprog.py:interepreterで

x = 1 

>>> import myprog 
>>> myprog.x 
1 
>>> from myprog import x 
>>> x 
1 

x = 2を設定myprog.pyを編集:

>>> reload(myprog) 
>>> myprog.x 
2 
>>> x 
1 

はSYを引っ張ってfrom myprog import *を繰り返して、再度グローバルスコープへのmbols:

>>> reload(myprog) 
>>> from myprog import * 
関連する問題