2011-11-14 16 views
10

यहाँ एक संक्षिप्त उदाहरण है:पायथन का imp.reload() फ़ंक्शन काम नहीं कर रहा है?

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' 

मैं क्यों दोनों यकीन नहीं है प्रिंट स्टेटमेंट वही हैं। मैं रीलोड() के बाद कक्षा x की नई परिभाषा का उपयोग कैसे कर सकता हूं?

+0

आप '.pyc' फ़ाइल को भी हटा सकते हैं, जो पाइथन को मॉड्यूल को पुन: संकलित करने के लिए मजबूर करेगा। – katrielalex

उत्तर

9

ऐसा इसलिए होता है क्योंकि फ़ाइल निर्माण तिथियां (z.py और इसके संकलित समकक्ष z.pyc) समान हैं, इसलिए पायथन सोचता है कि फ़ाइल अपरिवर्तित है और इसे पुन: संकलित नहीं करती है।

असल में, जब मैं आपके कोड को आजमा रहा था और फिर से कोशिश कर रहा था, तो यह एक बार अपेक्षित काम करता था - शायद इसलिए कि सिस्टम की घड़ी के दूसरे बदलाव के दोनों तरफ दो फाइलें बनाई गई थीं।

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

इस दौर के चारों ओर एक और तरीका जो कैश की गई फाइल को हटाने के लिए एक सेकंड के लिए सो रहा है। 'Os.remove (getattr (z, '__cached__', 'z.pyc') के साथ अपना 'time.sleep (1)' बदलें') (और 'शीर्ष पर आयात os') और आपको एक तेज़ संस्करण मिलता है जो अभी भी काम करता है। – Duncan

संबंधित मुद्दे