Python部署的最佳实践--多版本、标准安装位置、打包工具等。

19

有很多关于这个问题不同方面的帖子,但我没有看到一篇能将它们全部整合起来的文章。

首先是一个主观的声明:当我们离开解释器并开始处理部署问题时,与Python语言一起工作时所体验到的简单性似乎破碎了。如何在同一台计算机上拥有多个Python版本?包应该安装在哪里?Disutils vs. setuptools vs. pip等等。当涉及到部署时,好像Python之禅被滥用得相当严重。我感到Windows上“DLL hell”经历的阴森回声。

专家们是否就这些问题达成了某种最佳实践的共识?

您在同一台计算机上运行多个Python版本吗?您如何确保它们可以共存,而新版本不会破坏依赖早期版本的其他进程的假设(例如操作系统供应商提供的脚本)?这是安全的吗?virtualenv是否足够?

对于Python环境的不同组件(包括第三方包),哪些位置是最佳选择放置在本地文件系统上?许多不同版本的Unixy和Windows操作系统的位置是否有严格或粗略的对应关系可以依赖?

而这个泥沼最阴暗的角落——您使用哪些安装工具(setuptools、distutils、pip等)?它们是否与您的文件位置选择、Python虚拟环境、Python路径等相容?

这些听起来都是难题。我希望有经验的Python程序员已经定义了一种权威方法(或两种)来解决这些挑战。任何一个“一致”作为一个系统的方法(感觉不像是分离的、不相关的工具),都将非常有帮助。


1
我认为这个问题的定义过于宽泛。 - agf
自从我提出这个问题以来,我成为了virtualenvwrapper的粉丝——它简化了我所问的许多问题。每个变体分发工具仍然存在一些奇怪的问题,但拥有一个可以快速切换的隔离Python环境会帮助很多。 - Chris Johnson
3个回答

8
我发现 virtualenv 是在同一台机器上配置和维护多个环境的唯一可靠方法。它甚至有一种打包环境并在另一台机器上安装的方式。
对于软件包管理,我总是使用 pip,因为它与 virtualenv 配合得非常好。 它还可以轻松地从各种来源(如 git 存储库)安装和升级软件包。

3
我同意这是一个非常宽泛的问题,但我仍然会尝试回答其中的许多部分。
关于你的主观陈述:我不明白为什么Python的简洁和优雅会意味着打包和部署问题突然变得简单。与打包相关的一些事情很简单,其他的则不是,还有其他的可能是。如果我们有一个完整、强大且易于使用的打包系统,那对用户来说是最好的,但事实并非如此。distutils被创建,然后它的开发暂停了,setuptools被创建并添加了新的解决方案和新的问题,因为社交问题而分叉了distribute,最后创建了distutils2来制作一个官方的完整库。(更多信息请参见Distribute、Distutils、Setuptools和Distutils2之间的区别?)现在的情况对于开发者和用户来说都远非理想,但我们正在努力改善。
如何在同一台机器上拥有多个Python版本?如果您使用现代操作系统,则可以使用软件包管理器,如果您在UNIX上从源代码编译,则可以使用“make altinstall”,或者如果您在Windows上从源代码编译,则可以使用类似的无冲突安装方案。作为Debian用户,我知道我可以通过使用“pythonX.Y”来调用各个版本,并且默认版本(“python”和“python3”)是由Debian开发人员决定的。一些操作系统已经开始打破python == python2的假设,因此有一个PEP正在进行中来祝福或谴责它:http://www.python.org/dev/peps/pep-0394/ Windows似乎缺乏一种使用一个Python版本作为默认版本的方法,因此还有另一个PEP:http://www.python.org/dev/peps/pep-0397/ 软件包应该安装在哪里?使用distutils,我可以将项目安装到我的用户site-packages目录中(请参见PEP 370或docs.python.org)。确切的问题是什么?
不支持同一项目的不同版本的并行安装。这需要一个PEP来讨论导入系统和打包工具的更改。在有人开始讨论之前,使用virtualenv或buildout已经足够好了。
我不明白关于“Python环境组件”的位置的问题。

我主要使用系统软件包(即在Debian上使用Aptitude软件包管理器)。为了尝试项目,我会克隆它们的存储库。如果我需要使用Aptitude不可用的东西,我会安装(或将.pth文件放到存储库中)到我的用户site-packages目录中。我不需要自定义PYTHONPATH,但我已经使用PYTHONUSERBASE更改了用户site-packages的位置。我不喜欢setuptools/distribute中的魔法和eggs概念,所以我不使用它们。然而,对于一个项目我已经开始使用virtualenv和pip(他们在setuptools的覆盖下工作,但我进行了私有安装,因此我的全局Python不具备setuptools功能)。


0

这个领域的一个资源是Tarek Ziade的《Expert Python Programming》一书。我对这本书的质量持矛盾态度,但它所涵盖的主题正是你关注的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接