电源循环时Python pyc是否可能?

电源循环时Python pyc是否可能?,python,pyc,Python,Pyc,想知道python是否能够在给定py-to-pyc的编译阶段进行检查,以防止由于系统(和磁盘)突然断电而导致pyc损坏。 当系统恢复时,将检查可能存在的pyc的完整性 如果它被认为是可疑的,那么重新生成?据我所知,编译成字节码的过程在处理重新编译的方式上与普通的make相同;它检查编译后的文件是否比源文件旧,如果是,则重新编译,如果不是,则保持原样。我最好的建议是,只要怀疑突然断电,就清除PYC文件,并导入新文件(您可能也可以将其自动化,以使其更简单) 请注意,我并没有试验过Python是否会等

想知道python是否能够在给定py-to-pyc的编译阶段进行检查,以防止由于系统(和磁盘)突然断电而导致pyc损坏。 当系统恢复时,将检查可能存在的pyc的完整性
如果它被认为是可疑的,那么重新生成?

据我所知,编译成字节码的过程在处理重新编译的方式上与普通的
make
相同;它检查编译后的文件是否比源文件旧,如果是,则重新编译,如果不是,则保持原样。我最好的建议是,只要怀疑突然断电,就清除PYC文件,并导入新文件(您可能也可以将其自动化,以使其更简单)

请注意,我并没有试验过Python是否会等到字节码文件完成后再写入磁盘;如果是这样的话,这将减少您所说的那种损坏的可能性,因为如果在实际编译过程中发生电源故障,PYC文件将不会首先写入磁盘。但是,如果在写入过程中发生断电,则损坏仍然是一个问题,因为我相信大多数操作系统都会在使用写访问权限打开文件时更新文件的修改时间,而不是在关闭文件句柄时更新文件的修改时间。

如果我解释正确,Python3.3将以不同的名称创建
.pyc
文件,并在成功完成后对其重命名。我认为这是“原子的”(他们的术语),因为它在这种情况下得到,它肯定会保护你从突然崩溃或失去权力。早期版本(包括2.*分支)显然仍然受竞争条件和无效的
.pyc
文件的约束


不过,文件是否可以在不触发运行时异常的情况下无效是另一个问题。问题报告都谈到导入失败

谢谢@JAB;使用远程现场系统时,可能会突然断电,我看到pyc损坏;还有一个我刚才看到的bug线程();不管在系统启动时显式/完全控制pyc生成听起来很有必要,但很烦人,而且看起来会自动化——感谢大家,在非root环境中更新Python模块时,人们也会遇到类似的问题,这些模块以前是由root/具有更高访问权限的人编译的,并且新的pyc文件不会覆盖这些模块由于访问限制,现有的PYC文件已经存在,以至于在Python2.6+中,如果您对性能下降没有意见的话,实际上可以禁用PYC文件的生成。对py3.3感兴趣;谢谢亚历克西斯;我的pyc文件损坏触发了导入失败,因为pyc本质上是一个空文件(类似于pyc文件大小,好像py是空的,而不是空的)。我不确定如何测量pyc大小——如果文件系统说它是空的,它是空的;但不管怎样,听起来你的问题符合你的情况。大多数报告都是关于竞争条件导致的文件损坏,例如两个python进程同时写入同一个pyc文件。