2011-06-25 11 views
2

ここでは、reload()関数を使ってPythonモジュールをリロードするコードを示します。私はいくつか(すべてではありません:) :) stackoverflowの他の質問と回答を見ているが、私はまだos.remove( 'm.pyc')を行う必要がある私のコードを取得する。誰かが私にそれを説明したり、削除せずに以下の作業をするためにコードを変更する必要があるかどうかを私に見せてもらえますか?ほぼ同時に作成されることから、両方のファイルを防ぐためにtime.sleep(1)であなたの削除ステートメントを置き換えることによりもう1つのPythonモジュールのリロードに関する質問

import os 

open('m.py','wt').write(r'def f(str): print "Sooo Original : %s"%(str)') 
import m 
m.f('Original') 

os.remove('m.pyc') 

open('m.py','wt').write(r'def f(str): print "Not so original : %s"%(str)') 
m = reload(m) 
m.f('Copy') 

答えて

6

、私は正しい結果を得ます。私は、両方のファイルに同じタイムスタンプが付いているので、Pythonが変更を検出して本当にモジュールをリロードするのを防ぐことができると思います。

+0

はい私がそれをインポートするように要求しているときに、なぜpythonが実際にモジュールを再度インポートしないのか、それは私には奇妙です。 –

+0

pycはリロード機構に接続されていないキャッシュ機構です。 Pythonがキャッシュを再構築する必要性を検出しなければ、importとreloadは同じ古いpycを使用するのが普通だと思われます。必要なのはpycキャッシュを無効にする方法です(これはpycファイルを削除するときに行います)。 – JMD

+0

私が知る限り、それはタイムスタンプになるので、ファイルを待ったり削除したりするのではなく、m.pycのタイムスタンプを(過去の日付に)変更するのが別の方法です。 –

0

私のマシンでは別の問題が発生します。

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    m.f('Original') 
AttributeError: 'module' object has no attribute 'f' 

私はあなたがあなたのファイルを閉じていなかったことに気づいたので、それはファイルの内容をバッファに保持されていることと、ディスクに書き込まれるのを待っています。したがって、モジュールをリロードすると、Pythonは引き続きオリジナルのバージョンのファイルを表示します。 file.write

のドキュメントから

書き込み(...) 書き込み(STR) - >なし。文字列strをファイルに書き込みます。

バッファのために、 のファイルが書き込まれたデータを反映する前に、flush()またはclose()が必要な場合があることに注意してください。

次の機能はありますか?

関連する問題