gpt4 book ai didi

python - Python 2.5 .pyc 文件是否与 Python 2.6 .pyc 文件兼容?

转载 作者:IT老高 更新时间:2023-10-28 21:12:21 24 4
gpt4 key购买 nike

不久前,我不得不将一些服务器从 Python 2.4 升级到 Python 2.5。我发现在 Python 2.4 下创建的 .pyc 文件在 Python 2.5 尝试运行它们时会崩溃。

当我从 2.5 升级到 2.6 时会再次出现这种情况吗?

编辑:这里有更多细节

我有一个包含 python 代码的文件服务器。 Ubuntu 和 Windows 服务器都可以访问它来运行 python 代码。当他们运行代码时,他们会在文件服务器上生成 .pyc 文件。

我发现当我将其中一台服务器机器从 Python 2.4 升级到 2.5 时,我遇到了 .pyc 文件的问题。我现在不确定是运行 2.5 的机器尝试运行 2.4 字节码,还是尝试运行 2.5 字节码的 2.4 机器,但如果我删除字节码一切顺利,直到下一次字节码冲突。

我将所有机器升级到 2.5,问题就消失了。

最佳答案

通常,.pyc 文件特定于一个 Python 版本(尽管可以跨不同的机器架构移植,只要它们运行相同的版本);这些文件在其标题中包含有关相关 Python 版本的信息——因此,如果您将相应的 .py 文件留在 .pyc 文件旁边,则每次使用不同的 Python 版本导入这些模块时,都会重新构建 .pyc。 “试图运行”错误版本的 .pyc 文件是我从未听说过的。涉及哪些架构? .py 文件是否正常?

编辑:正如 OP 澄清说,当他在相同的 .py 文件(来自两个不同的服务器,共享网络驱动器),崩溃的解释变得容易。 .py 文件一直在重新编译——当 2.5 是最近运行它们的 Python 时,由 2.4 Python 重新编译,反之亦然——因此 .pyc 文件一直忙于重写。众所周知,在网络驱动器上正确锁定文件(尤其是但不限于跨不同操作系统)是很难实现的。所以肯定发生了以下情况(角色可以切换):2.4 服务器刚刚确定 .pyc 文件适合它并开始读取它;在它完成读取之前,2.5 服务器(之前已确定模块需要重新编译)覆盖它;所以 2.4 服务器最终得到了一个内存缓冲区,其中包含(比如说)2.4 版本的前 4K 字节和 2.5 版本的接下来的 4K 字节。当它使用那个损坏的缓冲区时,不出所料... crash!!!

如果您发现自己不断尝试从两个或多个不同版本的 Python 运行一组 .py 文件(即使在同一台服务器上,没有网络驱动器的额外复杂性),这可能是一个真正的问题。 “正确”的解决方案类似于 virtualenv 。我们在工作中采用的(简单但肮脏的)hack(很多年前,但它仍在生产中......!)是修补每个版本的 Python 以为其编译的字节码文件生成和使用不同的扩展名:.pyc (或 .pyo )用于 Python 1.5.2(当我们开始对较新版本进行此操作时,这是最稳定的“系统”版本),.pyc-2.0 用于 2.0,.pyc-2.2 用于 2.2,等等(或等效的 .pyo-X.Y)。我听说这很快就会消失(感谢 Thomas!-),但它确实让我们在很多很多年里解决了这个棘手的问题。

一个更简单的解决方案是保留一个 Python 版本,如果这对您的系统可行的话;如果您的系统有任何复杂性导致无法使用单个 Python 版本(就像我们所做的那样),那么这些天我衷心推荐 virtualenv ,我已经提到过。


随着 Python 3.2 中 PEP 3147 的采用,不同 Python 版本的 pyc 文件通过文件名自动区分。这应该可以解决不同 Python 版本覆盖彼此的 pyc 文件的大多数问题。

关于python - Python 2.5 .pyc 文件是否与 Python 2.6 .pyc 文件兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2263356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com