3

请参阅下面的复制代码。

跟踪内存泄漏我发现 reload(module) 不会立即生效。

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

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

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

我在 Windows 上,cpython27 32 位。

感谢您阅读本文。

# 这个程序假设文件夹 lib\mymodule 存在并且包含 __init__.py
进口时间
导入 io
导入 gc
模块文件 = 'c:\\python27\\lib\\mymodule\\simplemodule.py'
对于范围内的cnt(5):
    modulecode = """def runmodule():
    返回 %i
"""%(cnt)
    obj = io.open(模块文件,u'wb')
    obj.write(模块代码)
    obj.close()
    如果cnt==0:
        导入 mymodule.simplemodule
    别的:
        重新加载(mymodule.simplemodule)
    gc.collect()
    打印 mymodule.simplemodule.runmodule()
    time.sleep(0.05)
4

1 回答 1

4

问题是pyc不会重新生成,除非它相对于 undelying py文件已经过时。如果以一秒的分辨率检查文件修改时间,您的更新可能会被忽略,并且会调用过期的pyc而不是您更新的源。

  • 尝试在每次importreload之间删除pyc文件。

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

  • 您还可以使用execfile绕过导入逻辑。

于 2012-05-12T05:45:46.593 回答