【问题标题】:Python reload module does not take effect immediatelyPython重新加载模块不会立即生效
【发布时间】:2012-05-20 15:21:28
【问题描述】:

请参阅下面的复制代码。

跟踪内存泄漏发现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)

【问题讨论】:

  • 您在现实生活中的应用程序中使用reload() 吗?我认为这只是为了方便交互。
  • 这是重新加载的合法用例。几乎任何时候源文件更改(无论是自动还是通过编辑),reload 都是绕过缓存在 sys.modules 中的版本的方法。

标签: python module reload


【解决方案1】:

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

  • 尝试删除每个 importreload 之间的 pyc 文件。

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

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

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多