首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2.5 .pyc文件与Python2.6 .pyc文件兼容吗?

Python2.5 .pyc文件与Python2.6 .pyc文件兼容吗?
EN

Stack Overflow用户
提问于 2010-02-15 07:48:52
回答 5查看 6.2K关注 0票数 18

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

当我从2.5升级到2.6时,这种情况会再次发生吗?

编辑:这里有更多细节

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

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

我把所有的机器都升级到了2.5,这个问题就解决了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-15 07:58:30

通常,.pyc文件特定于一个Python版本(尽管可以在不同的机器体系结构之间移植,只要它们运行相同的版本);这些文件在它们的头中携带有关相关Python版本的信息--因此,如果将相应的.py文件放在.pyc文件旁边,那么每次使用不同的Python版本导入这些模块时,都会重新构建.pyc。“尝试运行”错误版本的.pyc文件是我从未听说过的事情。涉及到了哪些架构?.py文件是否按其应有的方式存在?

编辑:由于OP澄清了当他在相同的.py文件(来自两个不同的服务器,共享一个网络驱动器)上运行Python2.4和Python2.5程序时发生崩溃,所以对崩溃的解释变得很容易。.py文件一直在被重新编译--由2.4Python重新编译,而2.5是最近运行它们的版本,反之亦然--因此.pyc文件一直在疯狂地被重写。在网络驱动器上进行适当的文件锁定(特别是但不只是跨不同的操作系统)是出了名的困难。因此,一定发生了以下情况(角色可以互换):2.4服务器刚刚确定.pyc文件适合它,并开始读取它;在它可以完成读取之前,2.5服务器(之前已经确定模块需要重新编译)覆盖了它;因此2.4服务器最终拥有一个内存缓冲区,其中包含(比方说) 2.4版本的第一个4K字节和2.5版本的下一个4K字节。当它使用损坏的缓冲区时,不出所料...crash

如果您发现自己不断尝试从两个或更多不同版本的Python运行一组.py文件(即使在同一台服务器上,没有增加网络驱动器的复杂性),这可能是一个真正的问题。“合适的”解决方案应该是类似于virtualenv的东西。我们在工作中采用的(简单,但肮脏的)黑客(许多年前,但它仍然在生产中…!)就是为每个版本的Python打补丁,为其编译后的字节码文件生成和使用不同的扩展名: Python 1.5.2.pyc (或.pyo) (当我们开始使用新版本时,这是最稳定的“系统”版本)、.pyc-2.0的2.0版、.pyc-2.2的2.2版等等(当然也包括等价的.pyo-X.Y )。我听说这个问题很快就会消失(感谢托马斯!-),但它确实让我们半正式地度过了这个棘手的问题很多很多年。

一种简单得多的解决方案是保留单一版本的Python,如果这对您的系统可行;如果您的系统存在任何复杂问题,使得使用单一Python版本是不可行的(就像我们的系统一样),那么这些天我强烈推荐virtualenv,我已经提到过。

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

票数 16
EN

Stack Overflow用户

发布于 2010-02-15 08:19:59

如果你有源代码,它会帮你重新编译。所以大体上你是可以接受的。

但是,如果使用不同版本Python的用户从中央安装目录运行,这可能对您不利。

如果你只有pyc文件,也可能是不好的。我刚给你做了个快速测试。我创建了两个.pyc文件。1/ 2.5和1/ 2.6。2.5不能在2.6中运行,2.6不能在2.5中运行。两者都抛出"ImportError: Bad magic number in ..“错误,这是有意义的,因为幻数已经从2.5变成了2.6。

如果你想提前确定这一点,你可以获得Python的魔数,如下所示:

代码语言:javascript
复制
$ python -V
Python 2.6.2
# python
>>> import imp
>>> imp.get_magic().encode('hex')
'd1f20d0a'

要获取pyc文件的幻数,可以执行以下操作:

代码语言:javascript
复制
>>> f = open('test25.pyc')
>>> magic = f.read(4)
>>> magic.encode('hex')
'b3f20d0a'
>>> f = open('test26.pyc')
>>> magic = f.read(4)
>>> magic.encode('hex')
'd1f20d0a'
票数 5
EN

Stack Overflow用户

发布于 2010-02-15 07:54:22

创建该文件的Python版本存储在.pyc文件本身中。通常,这意味着.pyc将被具有正确Python版本的Python替换

这可能不会发生的一些原因

  • permissions
  • .py文件不可用于

在权限问题的情况下,Python将只使用.py而忽略.pyc (以性能为代价)

我认为在次要版本之间是可以的,例如Python2.6.2 .pyc应该可以与Python2.6.4一起使用

下面是/usr/share/file/magic的摘录

代码语言:javascript
复制
# python:  file(1) magic for python
0   string      """ a python script text executable
0   belong      0x994e0d0a  python 1.5/1.6 byte-compiled
0   belong      0x87c60d0a  python 2.0 byte-compiled
0   belong      0x2aeb0d0a  python 2.1 byte-compiled
0   belong      0x2ded0d0a  python 2.2 byte-compiled
0   belong      0x3bf20d0a  python 2.3 byte-compiled
0   belong      0x6df20d0a  python 2.4 byte-compiled
0   belong      0xb3f20d0a  python 2.5 byte-compiled
0   belong      0xd1f20d0a  python 2.6 byte-compiled

因此,您可以看到,.pyc文件的前4个字节指示了正确的Python版本

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2263356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档