Python 是否应该更新最新的Bugfix版本
假设您已经在Python社区里呆了一段时间,您可能会想起关于Python 2和Python 3的讨论,或者您可能会注意到像Python 3.10和Python 3.11这样的版本的发布引起了相当大的兴奋。你可能已经注意到,像3.10.8这样的三个数字代表Python的版本。在本文中,将重点讨论Python的Bugfix版本及第三个数字的重要性。
为开发人员创建版本控制方案并解密相应的版本号是一种艺术。语义化版本号和日历版本号是最受欢迎的两种方法。虽然存在一些重大变化,但Python的版本控制策略与语义化版本控制类似。
版本号通常表示为三个整数的元组,常缩写为MAJOR.MINOR.PATCH。您的版本控制方法确定了如何解释这三个数字:
- 最重要的数字是MAJOR。在日历版本控制中,经常使用发布年份。当更改不兼容以前的版本时,语义化版本控制技术会引入新的主要版本。目前需要有明确的计划发布Python的主要版本4,这是在2008年引入Python 3时最后一次更新。
- 第二个版本号是MINOR。此数字跟踪常规更新,同时又向后兼容以前的版本。在Python中,MINOR发布通常称为功能发布,可以删除过时的功能。每年的十月,Python社区发布一个新的功能版本。
- 第三个和最不重要的数字是PATCH。有时它被称为MICRO。版本之间的PATCH数字差异通常具有相同的功能。在Python中,PATCH发布有时被称为错误修复发布、维护发布或安全性修复发布。如它们的名称所示,这些版本仅包含错误和安全性修补程序。
在Python中,这些整数遵循严格的时间表。对于每个MINOR发布,Python特性都会经历相同的生命周期:
Python特性的生命周期发布。
- 图中显示了Python 3.11、3.13和3.15的生命周期。版本在其生命周期中的位置由PATCH数字表示。在发布日期前约17个月开始开发:
- 该版本经过全面测试,并在随后的五个月中准备好发布。•在前十二个月内创建新功能,并在alpha版本中发布。在此期间,发布beta和发布候选版本。
- 在特性发布后的十八个月中定期发布错误修复版本。
- 在特性发布后最多五年,按需发布安全性修复更新。
- 预发布版本是alpha、beta和发布候选版本的总称。这些版本在每个特性发布的开发和测试过程中都可以使用。您应该开始评估这些版本的代码。
- 本教程将重点关注Bugfix和安全性修复发布版本。虽然新的Python特性发布引起了一些热闹,因为它们为语言提供了新功能,但区分3.11.0和3.11.1等版本可能需要更多的工作。
问题:是否应该升级到Python的最新Bugfix发布?
答案:简而言之,是的,特别是在脆弱的生产系统中。
理由:与正在使用的Python特性发布的最新维护发布保持最新是一个好主意!
像所有复杂软件系统一样,Python也存在缺陷。其中大多数不会对你产生影响,但偶尔会发现漏洞并进行纠正。如果你使用敏感数据或系统易受可能有恶意意图的用户攻击的情况,维护最新的错误修复版本是必要的,以确保你和你的用户的安全。在某些情况和使用场景下,这更为关键。
注意: 对于你的安全而言,Python的最新功能发布是不必要的。Python一直得到支持,为期五年,在此期间,所有版本都会获得安全更新。
只有在更新最新的维护版本时,你才会获得新的Python功能。每个维护版本都包含在功能发布中。因此,你的系统的曝光和脆弱性应该是你的首要关注点。如果你的系统易受攻击,并可能产生严重后果,那么你需要一种程序来确保你的环境尽可能具有弹性。
使用自动连续集成系统来测试你的更改,以管理你的项目。你可以在Python Discourse上关注发布文章, 或者注册Python announce电子邮件列表,以接收有关Python新版本修复程序可用的通知。
两个功能发布之间不会有任何区别。只有在错误和安全修复中才会包含在错误修复版本中。如果你没有遇到任何隐藏的Python错误,并且在运行代码时没有与外部世界进行交互,那么始终使用最新的维护版本就不那么重要了。
然而,尽管你的较小项目中安全漏洞产生的风险和后果较小,但使用相对较新和安全的Python版本仍是一个好习惯。找到一种使运行多个Python版本并更新到新版本变得简单的工作流程是理想的。
如何方便地跟上新版本更新?
你的设置将决定如何升级生产系统到最新的错误修复版本。你可以编辑配置文件的版本号,然后重复你的测试。
发布错误修复和安全修复基本相同。错误修复版本是在功能发布后的前18个月内发布的维护版本。这些版本带有为每个操作系统定制的安装程序,并大约每两个月发布一次。安全修复版本是在前18个月后发布的版本。这些版本仅在必要时提供,并仅提供源代码。
在本节中,你将研究管理本地计算机上各种Python版本的一个潜在方法。在你的工作流中,应该管理编程设置的两个不同组成部分:
- 你的Python解释器版本
- 你的Python软件包版本
一般来说,你的系统可以支持许多Python版本。Python版本管理可以手动完成,也可以使用像conda或pyenv这样的程序进行管理。
最新的错误修复版本始终可以安装,无论你当前的版本如何。但是,如果你跳过版本,则更新中有更多的更改,因此你需要更加谨慎地进行测试。
你应该利用虚拟环境来管理你依赖的Python软件包。虚拟环境在创建时绑定到特定的Python版本。因此,你必须有一种实用的方法来创建一个新的虚拟环境来更新Python解释器。
你可以使用一个锁定文件,其中包含你所有依赖项及其特定版本的列表,以确保能够复制你的虚拟环境。尽管使用程序频繁地优于手动创建这样的锁定文件,但这是可行的。再次说明,有多种选择可用,包括pip-tools、Poetry、conda-lock和Pipenv。
虽然pip工具可以使用pip或pipe安装,但是pyenv必须单独安装。您可以选择和混合对于您最有效的工具。这里是使用pip-tools和pyenv的工作流程示例。
每次开始新项目时建立一个独特的项目目录是很有帮助的。下面的所有命令都必须在该项目目录中输入。从开始,把您的依赖项放在一个名为requirements.in的纯文本文件中。例如:
# requirements.in
您从本教程中了解到应更新到最新的Python bugfix版本。现在您了解了bugfix和feature版本之间的区别,并看到了更新项目的几种技巧。
$ pip-compile requirements.in
所有依赖项,即使是间接依赖项,都列在requirements.txt中,当运行pip-tools时将生成它:
# requirements.txt # # 使用Python 3.10的pip-compile将自动生成此文件。
# 运行:# # pip-compile requirements.in # 以更新
click==8.1.3
# 通过typer
commonmark==0.9.1
# 通过rich
pygments==2.13.0
# 通过rich
rich==12.6.0
# 通过-r requirements.in
typer==0.6.1
# 通过-r requirements.in
使用pip工具为每个依赖项附加特定版本。还包括有用的注释,解释为什么添加了每个依赖项。当在requirements.in中添加新的依赖项时,可以重新运行pip-compile。运行pip-compile -upgrade以将您的依赖项更新到最新版本。
您的要求文件将在开始项目时包含,并且您将不断更新它,无论何时升级Python版本。当您安装新的bugfix版本时,您的依赖关系不需要更新。依赖项将安装在新的虚拟环境中。
您必须先安装并激活使用pyenv安装新的维护版本的Python:
$$ pyenv update
$$ pyenv install 3.10.8
$$ pyenv local 3.10.8
要查看许多可用的Python版本列表,请键入pyenv install -list。
在那之后创建或重新创建您的虚拟环境,然后将其打开:
- macOS + Linux
- Windows
PS> Python -m venv venv --clear
PS> venv\Scripts\activate
即使您使用较旧版本的Python构建了您的虚拟环境,也使用-clear以确保已清除它。
安装锁定的要求到新的虚拟环境中,以完成该过程。
(venv) $ Python -m pip install -r requirements.txt
如果您通过要求文件不断添加要求,则可以确保可以重现您的环境。虽然这可能看起来是耗时的,但这种纪律将为您的Python解释器更新付出许多倍的代价,使其更容易。
如果您使用不同的工具,具体细节将发生变化。但是您应该能够遵循相同的基本程序。
如果您更新到最新的Python bugfix版本可能会出现什么问题?
- Python维护版本中包含一些更改。当前功能的行为不应再包含任何特性或修改。修复错误和安全问题是主要优先事项。
- 但是在升级到新的Python版本后,您必须始终运行您的测试。运行您的代码以确保一切都保持不变,如果您的爱好项目有一些测试。虽然出现问题的几率很小,但您可能会遇到一些情况。
- Python是一款复杂的软件,有时解决一个错误会导致出现另外一个错误。某些bugfix版本中可能存在意外的再现。例如,在Python 3.10.3中发现的一个缺陷使该语言在先前的Red Hat Enterprise Linux版本中无法使用。
- 回归问题已被Python核心团队解决,他们比预期发布了Python 3.10.4。每个Python版本的更改都在变更日志中列出。
- 你可能偶尔会无意中依赖于Python漏洞的行为。如果修复了这个缺陷,你的代码将无法正常工作。因此,你必须调整你的代码。虽然在短期内停止更新Python并保持代码不变似乎有点诱人,但还有其他可行的选项。
安全修复偶尔会影响你的代码。Python引入修复程序以防止特定形式的攻击。然而,这也意味着早期Python版本中的某些功能性代码不再有效。例如,对于大整数,Python 3.10.7禁止在字符串和整数类型之间进行转换。
在bugfix版本中进行如此重大的更改是有争议的且不常见的。如果这样的变化影响到你的项目,那可能会更加愉快。建议采取的行动是升级你的代码以使用最新的bugfix版本。
不同版本的Python是否兼容?
正如所述,bugfix版本不会引入或删除任何新功能。因此,你的代码应该在Python版本的每个维护版本中保持一致。
CPython用于与C扩展通信的应用二进制接口(ABI)在所有bugfix版本中保持一致。由于这种一致性,你可以使用来自第三方库的相同wheel更新你的bugfix版本。换句话说,你的需求文件可以更新。
是否需要升级到最新的功能版本?
将Python更新到最新的功能版本与将Python更新到最新的维护版本有很大的区别。你可以分别选择这些选项。即使你坚持使用早期的功能版本,你应该使用最新的bugfix版本。
新的功能版本添加新的功能,同时停用和删除旧的功能。因此,升级可能会导致你的代码不正常工作。在切换之前,你应该对系统进行全面评估。
注意:新功能教程系列包含有关每个Python版本中的新功能的信息。
应用二进制接口在Python的功能版本之间更一致可能会防止你更新到最新和最新的Python版本。实际意义是,C扩展库必须为新版本重新编译。在所有的依赖项提供与最新版本兼容的轮之前,这可能需要一些时间。
即使你没有使用最新的功能版本,你也是安全的,所以不要担心。正如你已经观察到的,Python功能版本在18个月内每月接受一次bugfix更新,并在五年内根据需要接受安全更新。
但你仍然需要有定期更新功能版本的策略。特别要小心,你的版本不能结束。
例如,如果一个功能版本经常接受bugfix更新,你可以继续使用它。当除安全补丁外不再接受更新时,你将升级到下一个版本。这意味着你将在新的Python功能版本发布约六个月后过渡到新的功能版本,因为bugfix版本仅在十八个月内可用。
结论
Python的错误修复版本很少引起太多关注。虽然事实是特性版本通常是最激动人心的,但关注例行的、低调的更新也是一个好主意。如果您保持跟进Python的版本发布,就可以知道您的解释器是否具有最新的错误修复和安全更新。您已经从本教程中学到应该更新到最新的Python错误修复发布版。您现在理解了错误修复和特性版本之间的区别,并已看到多种更新项目的技巧。