Python 2.x 和 3.x 无源 .pyc 部署

aba*_*bak 2 python compatibility python-2.x python-3.x

在 Python 2.x 中,.pyc文件存储在与源.py文件相同的目录中。在 Python 3.2+ 中,.pyc文件存储在__pycache__目录中。

如果代码编写正确,它可以由两个解释器运行,并且.pyc文件可以很好地共存。但一旦我想摆脱源代码,我就会遇到一个问题:Python 2.x 解释器仍然导入正确的.pyc文件,但 Python 3.2+ 解释器拒绝导入.pyc__pycache__目录编译的文件,并尝试.pyc从之前的版本由于幻数不匹配而失败。

是否有可能在不暴露源代码的情况下让两个Python解释器都满意?

[更新]

我尝试了这个(看起来像是一个解决方案):

  1. 照常部署源
  2. .pyc使用 Python 2.x 编译器编译每个 .py 文件(这将在同一目录中生成文件)
  3. 使用 Python 3.2+ 编译器编译每个 .py 文件(这将.pyc在目录中生成文件__pycache__
  4. 清除.py文件内容,同时保留其修改日期

Python 2 解释器很高兴。Python 3解释器怀疑源代码被修改并重新编译修改后的源代码。重新编译的原因是什么?它也存储源文件大小吗?校验和?

Mar*_*ers 5

.pyc如果没有.py文件或目录, Python 3 将使用同一位置的文件__pycache__请注意,如果源文件丢失, Python 3明确拒绝加载__pycache__文件,对于无源发行版,仅支持旧位置

出于这个原因,可以告诉模块compileall和命令.pyc在同一目录中生成文件:

python -m compileall -b
Run Code Online (Sandbox Code Playgroud)

但请考虑到字节缓存文件仍然是特定于 Python 版本的。您必须根据 Python 字节缓存幻数(通常随每个 .x 版本而变化)生成和分发缓存文件。

所以不,你不能拥有可.pyc在多个 Python 版本上运行的无源发行版。在 Python 3.2 之前也从来没有出现过这种情况,Python 2.6、2.7、3.0 和 3.1.pyc字节缓存文件每个都有一个唯一的字节缓存版本号,如果你给它一个.pyc来自其他版本的文件,Python 会抱怨这个“幻数”。