2011-11-14 23 views
10

Oto zwięzły przykład:Funkcja imp.reload() Pythona nie działa?

x.py:

class x: 
    var = 'from x.py' 

y.py:

class x: 
    var = 'from y.py' 

test.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' 

Nie jestem pewien, dlaczego zarówno instrukcje drukowania są takie same. Jak sprawić, by Python używał nowej definicji klasy x po przeładowaniu()?

+0

Można również usunąć plik '.pyc', który zmusi Python do ponownego skompilowania modułu. – katrielalex

Odpowiedz

9

Dzieje się tak, ponieważ daty utworzenia pliku (z.py i jego skompilowanego odpowiednika z.pyc) są identyczne, więc Python uważa, że ​​plik pozostaje niezmieniony i nie rekompiluje go.

Właściwie, kiedy próbowałem i ponownie próbowałem twojego kodu, zadziałało to zgodnie z oczekiwaniami - prawdopodobnie dlatego, że dwa pliki zostały utworzone po obu stronach drugiej zmiany zegara systemowego.

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' 

pokazuje oczekiwany wynik.

+3

Innym sposobem obejścia tego, co pozwala uniknąć snu przez sekundę, jest usunięcie pliku z pamięci podręcznej. Zastąp 'time.sleep (1)' zamkiem 'os.remove (getattr (z, '__cached__', 'z.pyc'))' (i 'import os' na górze), a otrzymasz szybszą wersję, która wciąż Prace. – Duncan