每当导入相应的代码元素时生成.pyc文件,并且如果相应的代码文件已更新则更新.pyc文件。 如果.pyc文件被删除,它们将自动重新生成。 但是,删除相应的代码文件时不会自动删除它们。
在文件级重构期间,这可能会导致一些非常有趣的错误。
首先,您最终可以推送仅适用于您的计算机而不是其他人的代码。 如果您对已删除的文件有悬空引用,那么如果您不手动删除相关的.pyc文件,这些文件仍可在本地使用,因为.pyc文件可用于导入。 这与以下事实相混淆:正确配置的版本控制系统只会将.py文件推送到中央存储库,而不是.pyc文件,这意味着您的代码可以通过“导入测试”(一切导入正常)就好了而不是 在别人的电脑上工作。
其次,如果将软件包转换为模块,则可能会遇到一些非常糟糕的错误。 将包(具有-B文件的文件夹)转换为模块(.py文件)时,保留曾经表示该包的.pyc文件。 特别是,__init__.pyc仍然存在。 所以,如果你的包foo包含一些无关紧要的代码,那么稍后删除该包并使用某些函数def bar(): pass创建一个文件foo.py并运行:
from foo import bar
你得到:
ImportError: cannot import name bar
因为python仍在使用foo包中的旧.pyc文件,其中没有一个定义bar。 这在Web服务器上尤其成问题,因为.pyc文件会导致功能完全正常的代码中断。
由于这两个原因(可能还有其他原因),您的部署代码和测试代码应删除.pyc文件,例如使用以下bash行:
find . -name '*.pyc' -delete
此外,从python 2.6开始,您可以使用-B标志运行python以不使用.pyc文件。 请参阅如何避免.pyc文件? 更多细节。
另请参阅:如何从项目中删除所有.pyc文件?