【问题标题】:When do Python cached bytecode (pyc) files get updated?Python 缓存字节码 (pyc) 文件何时更新?
【发布时间】:2015-05-25 05:00:54
【问题描述】:

有时我通过指向make PYTHON_TEST=path_of_module_to_test test 在特定模块上运行unittest,如果此模块path_of_module_to_test test 导入了其他一些已更新的python 模块,则从该模块完成的导入将从更新的py 源文件或从未更新的 pyc 文件,还是导入会导致更新依赖的 pyc 文件?

【问题讨论】:

  • Python (CPython 2.x) 检查.pyc (缓存字节码) 是否过期并重新编译一个新的根据需要缓存副本。
  • 我知道,但是如果我更新了一个 python 源文件但没有编译它,并且它有旧的 pyc python 字节码文件位于同一目录中,那么如果我在 path_of_module_to_test 上运行测试将获取更新的 py 或 pyc 文件,或者在导入完成时 pyc 将得到更新?

标签: python pyc


【解决方案1】:

来自PEP 3147

CPython 将其源代码编译为“字节码”,以提高性能 原因,它在文件系统上缓存这个字节码,只要 源文件有变化。这使得 Python 模块的加载很多 更快,因为可以绕过编译阶段。当你的来源 文件为 foo.py ,CPython 将字节码缓存在 foo.pyc 文件中 在源旁边。

如果您的来源发生变化; CPython 将重新编译并重新缓存字节码。

请注意,以上内容适用于Python 2.x。这一切都在Python 3.x 中在Python 3.2: PEP 3147: PYC Repository Directories 中发生了变化

注意:当我们在这里提到“CPython”时,我们指的是您最有可能从https://www.python.org 使用的 Python 实现作为这种行为(我相信) 是特定于实现的。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2015-08-18
    • 2018-08-23
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多