【问题标题】:Python's imp.reload() function is not working?Python 的 imp.reload() 函数不起作用?
【发布时间】:2011-11-14 14:04:43
【问题描述】:

这是一个简洁的例子:

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'

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

【问题讨论】:

  • 你也可以删除.pyc文件,这将强制Python重新编译模块。

标签: python import


【解决方案1】:

发生这种情况是因为文件创建日期(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'

显示预期结果。

【讨论】:

  • 另一种避免休眠的方法是删除缓存文件。将您的 time.sleep(1) 替换为 os.remove(getattr(z, '__cached__', 'z.pyc'))(和顶部的 import os),您将获得一个仍然有效的更快版本。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多