首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时刷新.pyc文件?

何时刷新.pyc文件?
EN

Stack Overflow用户
提问于 2013-04-06 01:05:59
回答 2查看 53.2K关注 0票数 96

我知道".pyc“文件是纯文本".py”文件的编译版本,在运行时创建是为了让程序运行得更快。然而,我观察到了一些事情:

  1. 修改"py“文件后,程序行为发生变化。这表明"py“文件被编译,或者至少经过某种散列过程或比较时间戳,以便判断它们是否应该删除所有".pyc”文件(rm *.pyc)有时程序行为会改变。这表明它们在更新“.py”s时不会被编译。

问题:

  • 他们如何决定何时编译?
  • 有没有办法确保他们在编译期间有更严格的检查?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-06 01:11:19

只有当其他脚本导入.pyc文件时,才会创建(并可能覆盖)该python文件。如果调用了导入,Python将检查.pyc文件的内部时间戳是否不早于相应的.py文件。如果存在,则加载.pyc;如果不存在,或者.pyc尚不存在,则Python将.py文件编译为.pyc并加载它。

你说的“更严格的检查”是什么意思?

票数 84
EN

Stack Overflow用户

发布于 2013-10-14 12:41:22

导入相应的代码元素时生成的.pyc文件,如果相应的代码文件已更新,则更新这些文件。如果删除.pyc文件,则会自动重新生成这些文件。但是,当相应的代码文件被删除时,它们是而不是自动删除。

在文件级重构期间,这可能会导致一些非常有趣的bug。

首先,你最终可能会推送只在你的机器上运行的代码,而不是其他人的。如果你有对你删除的文件的悬空引用,那么如果你不手动删除相关的.pyc文件,这些引用仍然可以在本地工作,因为.pyc文件可以在导入中使用。此外,正确配置的版本控制系统只会将.py文件推送到中央存储库,而不会将.pyc文件推送到中央存储库,这意味着您的代码可以通过“导入测试”(一切导入都正常),并且不能在其他任何计算机上运行。

其次,如果你把包变成模块,你可能会有一些非常可怕的bug。当您将包(包含__init__.py文件的文件夹)转换为模块( .py文件)时,曾经表示该包的.pyc文件将保留。特别是,__init__.pyc仍然存在。因此,如果您的包foo包含一些无关紧要的代码,那么稍后删除该包,并使用某个函数def bar(): pass创建一个文件foo.py,然后运行:

代码语言:javascript
复制
from foo import bar

你会得到:

代码语言:javascript
复制
ImportError: cannot import name bar

因为python仍然使用foo包中的旧.pyc文件,这些文件都没有定义bar。这在web服务器上可能尤其有问题,在web服务器上,完全正常的代码可能会因为.pyc文件而崩溃。

由于这两个原因(可能还有其他原因),您的部署代码和测试代码应该删除.pyc文件,例如使用以下bash行:

代码语言:javascript
复制
find . -name '*.pyc' -delete

此外,从Python2.6开始,您可以不使用.pyc文件来运行带有-B标志的python。有关更多详细信息,请参阅How to avoid .pyc files?

另请参阅:How do I remove all .pyc files from a project?

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15839555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档