我知道".pyc“文件是纯文本".py”文件的编译版本,在运行时创建是为了让程序运行得更快。然而,我观察到了一些事情:
rm *.pyc)有时程序行为会改变。这表明它们在更新“.py”s时不会被编译。问题:
发布于 2013-04-06 01:11:19
只有当其他脚本导入.pyc文件时,才会创建(并可能覆盖)该python文件。如果调用了导入,Python将检查.pyc文件的内部时间戳是否不早于相应的.py文件。如果存在,则加载.pyc;如果不存在,或者.pyc尚不存在,则Python将.py文件编译为.pyc并加载它。
你说的“更严格的检查”是什么意思?
发布于 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,然后运行:
from foo import bar你会得到:
ImportError: cannot import name bar因为python仍然使用foo包中的旧.pyc文件,这些文件都没有定义bar。这在web服务器上可能尤其有问题,在web服务器上,完全正常的代码可能会因为.pyc文件而崩溃。
由于这两个原因(可能还有其他原因),您的部署代码和测试代码应该删除.pyc文件,例如使用以下bash行:
find . -name '*.pyc' -delete此外,从Python2.6开始,您可以不使用.pyc文件来运行带有-B标志的python。有关更多详细信息,请参阅How to avoid .pyc files?。
https://stackoverflow.com/questions/15839555
复制相似问题