2012-05-12 8 views
3

以下の再現コードを参照してください。Pythonリロードモジュールがすぐに有効にならない

メモリリークのトレースリロード(モジュール)がただちに有効にならないことがわかりました。

以下のプログラムは0,1,2,3,4を出力するはずですが、速く実行すると0,0,0,3,3などのシーケンスが出力されます。 sleep()関数の時間を例えば1秒に増やすことは、これを修正するようです。

このコードは、問題を再現するための実用的なコードの煮詰めバージョンであり、実際の生活アプリの状況に対処する必要があることに注意してください。

誰でも安定性を確保する方法を知っていますか?

私は窓に、cpython27 32ビットです。

お読みいただきありがとうございます。

 
# this program assumes folder lib\mymodule exists and contains __init__.py 
import time 
import io 
import gc 
modulefile = 'c:\\python27\\lib\\mymodule\\simplemodule.py' 
for cnt in range(5): 
    modulecode = """def runmodule(): 
    return %i 
"""%(cnt) 
    obj = io.open(modulefile, u'wb') 
    obj.write(modulecode) 
    obj.close() 
    if cnt==0: 
     import mymodule.simplemodule 
    else: 
     reload(mymodule.simplemodule) 
    gc.collect() 
    print mymodule.simplemodule.runmodule() 
    time.sleep(0.05) 
+1

実際のアプリで 'reload()'を使用していますか?私はそれがインタラクティブな便利のためだと思った。 –

+1

これはリロードの正当な使用例です。ソースファイルが変更されたときはいつでも(自動でも編集でも)、* reload *は* sys.modules *にキャッシュされたバージョンをバイパスする方法です。 –

答えて

4

問題は、それがundelying PYファイルに対する期限切れのでない限りPYCが再生されないということです。ファイルの修正時間が1秒の解像度でチェックされている場合、アップデートは無視され、アップデートされたソースではなく、古くなったpycが呼び出されます。

  • 輸入またはリロードPYCファイルを削除してください。

  • また、環境変数を設定することもできます。

  • execfileを使用してインポートロジックをバイパスすることもできます。

関連する問題