据我所知,“pyc文件”文件被编译的纯文本“ py”为文件的版本,在运行时创建,以使程序运行更快。 但是我观察到的几件事情:
- 在的“PY”文件的修改,程序的行为变化。 这表明,“PY”文件进行编译,或者至少去虽然某种散列处理的或比较时间戳以便告诉他们是否应该重新编译。
- 在删除所有“.pyc文件”文件(
rm *.pyc
),有时候程序的行为会发生变化。 这将表明他们没有被上的“py”为的update编译。
问题:
- 他们如何决定何时进行编译?
- 有没有一种方法,以确保他们在开发过程中更严格的检查?
该.pyc
文件被创建(并可能覆盖)仅当蟒蛇文件是否已被其他脚本导入。 如果导入被调用,Python的检查,看看是否.pyc
文件的内部时间戳是不低于相应年龄较大.py
文件。 如果是,它加载的.pyc
; 如果不是,或者如果.pyc
不存在,Python的编译.py
文件到一个.pyc
并加载它。
你所说的“严格检查”是什么意思?
生成的pyc文件每当对应的代码元素被导入,并且如果对应的代码文件已被更新更新。 如果pyc文件被删除后,它们将被自动重新生成。 然而,它们不会自动在相应的代码文件被删除删除。
这可以在文件级refactors导致一些真正有趣的错误。
首先,你可以最终推代码,只能你的机器上并没有其他人的。 如果你有你删除的文件悬空的引用,这些仍然会在本地工作,如果你不手动删除相关pyc文件,因为pyc文件可以导入使用。 这就是复利的事实,正确配置的版本控制系统将只文件推的.py到中央存储库,而不是pyc文件,这意味着你的代码可以通过“导入测试”(做一切进口没关系)就好了,不其他人的电脑上工作。
其次,你可以有一些非常可怕的错误,如果你把包成模块。 当转换包(带文件夹__init__.py
文件)到一个模块(.py文件),一旦该代表包pyc文件依然存在。 特别是, __init__.pyc
依然存在。 所以,如果你有一些代码,也没关系的软件包foo,然后再删除该程序包,并创建一些功能的文件foo.py def bar(): pass
并运行:
from foo import bar
你得到:
ImportError: cannot import name bar
因为蟒蛇依然采用来自于Foo包老pyc文件,其中没有一个定义吧。 这可以是一个Web服务器,完全运作代码,因为pyc文件的打破尤其成问题。
由于这两个原因(可能还有其他人),您的部署代码和测试代码应该删除pyc文件,如与以下行的bash的结果:
find . -name '*.pyc' -delete
此外,由于蟒蛇2.6的,你可以用运行python -B
标志不使用pyc文件。 请参阅如何避免pyc文件? 更多细节。
参见: 如何从一个项目中删除所有pyc文件?