2011-11-14 9 views
10

はここで簡潔な例です:Pythonのimp.reload()関数が機能していませんか?

x.py:

class x: 
    var = 'from x.py' 

y.py:私は、なぜ両方わからない

import imp 
def write_module(filename): 
    fp = open('z.py', 'w') 
    fp.write(open(filename).read()) 
    fp.close() 

write_module('x.py') 
import z 
print(z.x.var) # Prints 'from x.py' 
write_module('y.py') 
imp.reload(z) 
print(z.x.var) # Prints 'from x.py' 

class x: 
    var = 'from y.py' 

test.py printステートメントは同じです。 reload()の後に、どのようにしてPythonにクラスxの新しい定義を使用させることができますか?

+0

'.pyc'ファイルも削除できます。これにより、Pythonは強制的にモジュールを再コンパイルします。 – katrielalex

答えて

9

ファイルの作成日(z.pyおよびそのコンパイルされたファイルの対応番号z.pyc)が同じであるため、Pythonはファイルが変更されていないと判断して再コンパイルしないためです。

実際には、コードを試して再試行していたときに、おそらく2回のファイルがシステムクロックの2回目の切り替えのいずれかの側で作成されていたためです。

import imp 
import time 
def write_module(filename): 
    fp = open('z.py', 'w') 
    fp.write(open(filename).read()) 
    fp.close() 

write_module('x.py') 
import z 
print(z.x.var) # Prints 'from x.py' 
time.sleep(1) # Wait one second 
write_module('y.py') 
imp.reload(z) 
print(z.x.var) # Prints 'from y.py' 

は、期待される結果を示す。

+3

もう1つの方法は、1秒間スリープしなくても済むようにして、キャッシュされたファイルを削除することです。あなたの 'time.sleep(1)'を 'os.remove(getattr(z、 '__cached__'、 'z.pyc'))'(上の '' import os')に置き換えれば、働く – Duncan

関連する問題