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

标签 python python-3.x compatibility python-2.x

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

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

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

[已更新]

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

  1. 照常部署源
  2. 使用 Python 2.x 编译器编译每个 .py 文件(这将在同一目录中生成 .pyc 文件)
  3. 使用 Python 3.2+ 编译器编译每个 .py 文件(这将在 __pycache__ 目录中生成 .pyc 文件)
  4. 清除 .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/

相关文章:

python - 如何使用 Telethon 从 Telegram 消息中获取图像字节

python - Linux:让 systemd 立即终止正在运行的 Python 脚本?

python - djangorest框架中的序列化错误

python - 在python中将文件作为列表读取

file - python 3 : reading UCS-2 (BE) file

c++ - 使用 Boost 创建具有向后兼容 ABI 的库

python - 如何通过 xmlrpc (python) 传输二进制数据?

python 3 : Shared Array with strings between processes

sql-server - 无法在 Windows 8.1 上安装 LocalDB

html - 3列表作为DIV