Python的imp.reload()函数无法正常工作?

11

以下是一个简洁的示例:

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'

我不确定为什么这两个打印语句都相同。如何在使用reload()之后使Python使用类x的新定义?


你也可以删除.pyc文件,这将强制Python重新编译模块。 - Katriel
1个回答

9
这是因为z.py和它的编译版本z.pyc的创建日期相同,所以Python认为文件没有改变,不会重新编译。实际上,当我试着反复运行你的代码时,有一次结果符合预期 - 可能是因为这两个文件在系统时钟的秒转换之前或之后创建。
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
另一种避免必须睡眠一秒钟的方法是删除缓存文件。将time.sleep(1)替换为os.remove(getattr(z, '__cached__', 'z.pyc'))(在顶部导入os),这样你就可以得到一个更快但仍然有效的版本。 - Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接