Python重装模块不会立即生效

时间:2012-05-12 05:37:01

标签: python module reload

请参阅下面的复制代码。

跟踪内存泄漏我发现重装(模块)不会立即生效。

下面的程序应该打印0,1,2,3,4但是,当快速执行时,它会输出像0,0,0,3,3这样的序列。将sleep()函数中的时间增加到例如1秒似乎可以解决这个问题。

请注意,此代码是更实用的代码的简化版本,只是为了重现问题,我需要处理现实应用中的情况。

有人知道如何确保稳定性吗?

我在Windows上,cpython27 32位。

感谢您阅读本文。

# this program assumes folder lib\mymodule exists and contains __init__.py
import time
import io
import gc
modulefile = 'c:\\python27\\lib\\mymodule\\simplemodule.py'
for cnt in range(5):
    modulecode = """def runmodule():
    return %i
"""%(cnt)
    obj = io.open(modulefile, u'wb')
    obj.write(modulecode)
    obj.close()
    if cnt==0:
        import mymodule.simplemodule
    else:
        reload(mymodule.simplemodule)
    gc.collect()
    print mymodule.simplemodule.runmodule()
    time.sleep(0.05)

1 个答案:

答案 0 :(得分:4)

问题是 pyc 不会重新生成,除非它与未定义的 py 文件相比已过时。如果以1秒的分辨率检查文件修改时间,则可能会忽略您的更新,并且会调用过时的 pyc 而不是更新的源。

  • 尝试在每个导入重新加载之间删除 pyc 文件。

  • 或者,您可以设置环境变量PYTHONDONTWRITEBYTECODE=1

  • 您还可以使用execfile

  • 绕过导入逻辑