【问题标题】:Python 2.7.X to 2.7.Y compatibilityPython 2.7.X 到 2.7.Y 的兼容性
【发布时间】:2020-08-08 10:24:54
【问题描述】:

我想在最新版本的 Python 2.7(比如 2.7.18)上开发和测试我的项目,但我希望我的项目在早期版本的 2.7 上仍然完全可用(比如2.7.7)。在本地或/和 CI 上设置 2.7 的许多变体进行测试可能是多余的。

所以有以下关于2.7.X的兼容性问题。

  1. 语法中是否有任何更改导致代码无法工作?
  2. 可用的标准导入是否有任何变化,例如,来自__future__ 的某些导入是否在早期版本中不可用?
  3. 由于我必须分发已编译的 Python 文件(.pyc,通过 py_compile 模块编译),我还想知道 Python 字节码 中是否有任何更改会阻止代码执行早期版本。

我想如果所有答案都是“否”,我可以只在一个 2.7 版本上开发和测试我的项目,而无需担心。

我试图搜索它,但没有成功。请分享您的经验和/或链接。

UPD 1:我应该从一开始就明确表示,使用2.7不是我的愿望,这是环境的要求。

【问题讨论】:

  • 作为初学者,没有最新版本的 Python 2.7。这是生命的尽头。对于新项目,请使用最新版本(如 3.8)。 Python 2.7 也是 AFAIR 唯一一个有重大变化的 dot-release。 ssl 模块在 2.7.9 中已更改。此外,一些发行版采用了更改而不是发布号,以增加混乱。
  • 缺乏努力/研究,仅 Python 2.7 的明显更改日志就列出了一系列可能会打破您的假设的更改:docs.python.org/2.7/whatsnew/…
  • @schlenk 我不确定您的链接在哪里清楚地说明了不兼容性。没有关于那里的重大更改的信息...我在其他地方搜索过此类信息,也没有找到。
  • @SerVB:引用的更改日志至少调用了新模块(ensurepip)和现有模块中的许多新功能/更改,这符合您的第二点。

标签: python python-2.7 compatibility bytecode cpython


【解决方案1】:

至少 Python 2.7.9 对“ssl”模块进行了大量更改,因此尝试在早于 2.7.9 的 Python 上使用 2.7.18 的 SSL 代码将失败。所以对第 2 点说“是”。

一般来说,大多数项目的兼容性都是相反的,使用您需要支持的最旧版本并从旧到新向上工作,而不是从新到旧向下工作。我不知道有任何软件项目可以保证相反的方向。

请注意,Python 2.7 不再支持 2.7.18,因此除非您使用像 PyPy (https://www.pypy.org/) 这样的兼容版本,否则您新开发的项目将从一开始就在过时的 Python 版本上运行。

如果您想提供收缩包装的产品,不妨看看常用的解决方案,例如 pyinstaller (https://www.pyinstaller.org/) 或 freeze (https://wiki.python.org/moin/Freeze)

如果您研究字节码操作码列表(https://github.com/python/cpython/commits/2.7/Include/opcode.h)但不知道磁盘上的格式是否发生了变化,那么 #3 可能会起作用。

【讨论】:

  • SSL 的好例子,谢谢。我不能缩小我的分布,它必须是一组.pyc 文件。用户已经有了口译员,并且想使用他们的口译员,而不是我的口译员。
  • @SerVB 使用他们的版本进行开发。
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 2015-12-23
  • 2018-01-19
  • 2019-04-10
  • 2012-02-11
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多