Python的imp.reload()函数无效?

11 投票
1 回答
7183 浏览
提问于 2025-04-17 06:17

这里有一个简单的例子:

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的新定义呢?

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'

显示了预期的结果。

撰写回答