一如既往,这是一种权衡,我在标准和可预测性方面犯了错误。我敏锐地意识到,尤其是对于单一用途的 Python 容器,例如Python:。*– 通过全局安装所有内容来实现多阶段构建是很流行的复制

超过站点包从Python安装的内部,或者设置Python用户群环境变量类似的东西/应用程序,并使用pip安装--用户而不是点安装, 进而复制超过所有这些的前提是它更简单并且一层隔离就足够了。我并不质疑一层隔离的充分性,但多年来,我发现在生产中,在谈论简单性时需要记住的不仅仅是一个方面。作为一个总体主题,我的目标是不是

盲目地遵循一些“最佳实践”,这会增加可疑回报的复杂性,因为一位大型技术开发倡导者在一次会议上这么说。


但我花了很多时间思考次要效应我所做的事情。对我来说,复杂性并不在于我必须按多少个键,而是在于推理我正在做的事情的后果有多困难。因此,以下是我仍然使用虚拟环境并计划在未来这样做的不完整原因列表:

可预测性和熟悉度

它们的结构定义良好,旨在容纳单个 Python 应用程序。

我喜欢它们的目录层次结构,其中包括

垃圾桶,, 和分享目录,使其成为默认情况下自包含应用程序的绝佳“容器”。它需要存储辅助文件,包括附加文件中的奇怪配置文件ETC目录。所有这些使它们非常适合放入一些东西/选择/应用程序或者/应用程序

是的,与十年前不同,您不必再将应用程序与系统 Python 隔离。但保留你的位于隔离的、定义明确的位置和结构中的代码本身就有价值。我负责数十项服务,因此我很感激

一致性知道我正在部署的所有内容都在/应用程序,如果它是一个 Python 应用程序,我知道它是一个虚拟环境,如果我运行/应用程序/bin/python,我获得了虚拟环境的 Python,并准备好导入和运行我的应用程序。标准和沟通

所有这些一致性使得

团队内部和团队之间的沟通更轻松。如果我说/记录部署工件是虚拟环境,每个人都知道这意味着什么。如果他们不这样做,互联网上就会充满文档,其中包括官方一。就像当黑色的让我们停止思考和争论代码风格,并将这些精神资源释放到更重要的事情上1。这就是标准的最终价值,即使人们并不喜欢标准的一切。

虚拟环境已经Python 的核心功能12年也是自 2000 年代中期以来 Python 社区的核心概念。这是我们最接近的东西Python 中封闭的、标准化的、易于理解的应用程序构建工件。这是一个延伸的类比,但我认为它们是在编译语言中链接动态二进制文件的结果。

你可以使用它们本地,您可以使用部署它们发行版包,你可以使用 Docker 容器部署它们它是好的在开发和生产中使用相同的工具和原语。这意味着您了解自己的工具并且需要记住的事情更少。因此,使用不同的方法来部署应用程序应该能带来切实的好处。

导入复杂性崩溃

这是虚拟环境的普遍优点(无论是在本地还是在 Docker 中),您可以缩小相关搜索路径Python 将在其中查找要导入的代码2。运行Python在通过隔离模式-我 将进一步缩小范围。

所以,如果你 a) 永远不要全局安装任何东西3,你 b) 使用Python来自虚拟环境的二进制文件尽管通过它-我, 你知道标准库中没有的所有内容必须处于虚拟环境中。这使得 Python 的导入行为更加有效可预测的调试导入问题不再是谋杀之谜。

这让我们想到……

可以安全地忽略的奖励点,但我需要把它说出来

地狱没有像我所感受的那样的愤怒pip安装--用户。这是一个极具吸引力的麻烦,对 Python 的不良打包声誉造成了很大的损害。

它主要用于掩盖操纵系统带来的更糟糕的影响站点包目录 – 损坏 Python 安装的最常见原因。所有这些都是为了启用用户本地安装4,这从一开始就是一个坏主意。从这个意义上说,新项目管理生态系统及其项目目录本地优先包装远远领先于我们,停留在我们古老的、懒惰的方式上。

最后,通过添加以下内容,Python 安装的推理变得更加复杂其他移动部分。如果每次有人因为用户本地 Python 包中的奇怪内容而在错误跟踪器上对我大喊大叫时,我都会得到一毛钱,那么我就不必这样做了请求赞助。就如我所爱的那样项目数据管理,我每天都感谢克苏鲁PEP 582 /__pypackages__被拒绝,因为它会添加其他混乱的向量。项目本地标准化.venv是明确正确的举动,即使更喜欢将我的虚拟环境存储在一个中心位置。

最后:就像,……到底为什么?

您到底想在这里解决什么问题?它不是一个额外的工具或一个额外的概念 - 或者它就存在于标准库,或者您正在使用紫外线已经。和紫外线,创建虚拟环境并不比创建虚拟环境花费更长的时间目录。他们可能是轻微地更大,但它们真的很重要吗?通过避免使用一种标准方法将 Python 项目及其所有依赖项隔离到易于处理的目录中,您不会使任何事情变得更简单。

我想知道对虚拟环境的抵制有多少不是出于技术原因,而是根源于每次 Python 更新都会破坏它们Debian 对 Python 安装的烦人分拆让它们使用起来很痛苦。

我希望紫外线— 便利性和速度将改变公众的看法。

结语

我在文章开头描述的快捷方式依赖于以下假设站点包— 位置和便携性。他们引入了复杂性,例如使用pip安装--用户(这在 Docker 中在语义上很奇怪,并且从来不打算用于这样的事情)并且与您在开发中使用的工具和范例相比,可能需要不熟悉的工具和范例。-----------ª

我并不是想说服你做任何事。我确实意识到我的一些原因是在无形的~氛围~方面。如果您在这些捷径的范围内并且对权衡感到满意,那么您可以自由地做您想做的事情。但我希望我已经向你表明,它确实一般来说,在 Docker 中使用虚拟环境是否有意义 – 是否有意义,是为了来决定。我只是厌倦了每次都为自己辩护,所以我在这里一劳永逸地阐述我的观点。

如果经历了这一切之后你是仍然如果对 Python 和 Docker 感兴趣,我建议从生产就绪的 Docker 容器紫外线,这是我如何尽快为 Python 应用程序构建 Docker 容器的动态文档。


附:我简直不敢相信我竟然在我可敬的人十周年纪念日那天发表了这篇文章– virtualenv 还活着!!很多事情都变得更好了,但虚拟环境仍在不断进步。

这篇文章是由捐款来自欣赏我的公共工作的人和公司。

想要更多这样的内容吗?这是我的免费、低容量、不令人毛骨悚然的海尼克做了一些事通讯!它允许我直接与您分享我的内容并添加额外的上下文: