在 Python 2.x 中,.pyc
文件与源 .py
文件存储在同一目录中。在 Python 3.2+ 中,.pyc
文件存储在 __pycache__
目录中。
如果代码编写正确,它可以由两个解释器运行,并且 .pyc
文件可以很好地共存。但一旦我想摆脱源代码,我就会遇到一个问题:Python 2.x 解释器仍然导入正确的 .pyc
文件,但 Python 3.2+ 解释器拒绝导入其编译的 .pyc
来自 __pycache__
目录,并尝试从以前的版本导入 .pyc
文件,但由于魔数(Magic Number)不匹配而失败。
是否有可能在不暴露源代码的情况下让两个Python解释器都满意?
[已更新]
我尝试了这个(看起来像是一个解决方案):
- 照常部署源
- 使用 Python 2.x 编译器编译每个 .py 文件(这将在同一目录中生成
.pyc
文件) - 使用 Python 3.2+ 编译器编译每个 .py 文件(这将在
__pycache__
目录中生成.pyc
文件) - 清除
.py
文件内容,同时保留其修改日期
Python 2 解释器很高兴。 Python 3解释器怀疑源代码被修改并重新编译修改后的源代码。重新编译的原因是什么?它也存储源文件大小吗?校验和?
最佳答案
如果没有 .py
文件或 __pycache__
目录,Python 3 将在同一位置使用 .pyc
文件。请注意,Python 3 explicitly refuses to load __pycache__
files if the source file is missing ,对于无源发行版,仅 legacy locations are supported .
compileall
module and command出于这个原因,可以被告知在同一目录中生成 .pyc
文件:
python -m compileall -b
但请考虑到字节缓存文件仍然是特定于 Python 版本的。您必须根据 Python 字节缓存魔数(Magic Number)(通常随每个 .x 版本而变化)生成和分发缓存文件。
所以不,您不能拥有可在多个 Python 版本上运行的 .pyc
无源发行版。在 Python 3.2 之前也从来没有出现过这种情况,Python 2.6、2.7、3.0 和 3.1 .pyc
字节缓存文件每个都有一个唯一的字节缓存版本号,如果您给出“魔数(Magic Number)”,Python 会提示它是另一个版本的 .pyc
文件。
关于Python 2.x 和 3.x 无源 .pyc 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56557001/