2011-11-14 27 views
10

Dưới đây là một ví dụ ngắn gọn:Hàm imp.reload() của Python không hoạt động?

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' 

Tôi không chắc chắn lý do tại sao cả báo cáo in là như nhau. Làm thế nào tôi có thể làm cho python sử dụng định nghĩa mới của lớp x sau khi tải lại()?

+0

Bạn cũng có thể xóa tệp '.pyc', tệp này sẽ buộc Python biên dịch lại mô-đun. – katrielalex

Trả lời

9

Điều này xảy ra do ngày tạo tệp (trong số z.py và đối tác được biên dịch z.pyc) giống nhau, vì vậy Python cho rằng tệp không thay đổi và không biên dịch lại.

Thật ra, khi tôi đang thử và thử lại mã của bạn, nó đã từng hoạt động như mong đợi - có thể do hai tệp đã được tạo ở hai bên của chuyển đổi thứ hai của đồng hồ hệ thống.

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' 

hiển thị kết quả mong đợi.

+3

Cách khác để tránh việc phải ngủ trong một giây là xóa tệp đã lưu trong bộ nhớ cache. Thay thế 'time.sleep (1)' bằng 'os.remove (getattr (z, '__cached__', 'z.pyc'))' (và 'import os' ở trên cùng) và bạn nhận được một phiên bản nhanh hơn công trinh. – Duncan

Các vấn đề liên quan