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

19 投票
3 回答
5712 浏览
提问于 2025-04-17 00:32

这个问题在不同的帖子中讨论了很多方面,但我还没看到一个帖子把这些内容整合在一起。

首先,我想说的是:当我们使用Python语言时,感觉很简单,但一旦离开解释器,开始处理部署问题时,这种简单感就消失了。比如,怎么在同一台机器上安装多个版本的Python?包应该安装在哪里?Disutils、setuptools和pip之间有什么区别?在部署时,Python的设计理念似乎被严重扭曲了。我感觉到了类似Windows上“DLL地狱”的困扰。

专家们在这些问题上有没有达成一些最佳实践的共识呢?

你在同一台机器上运行多个版本的Python吗?你怎么能确保它们可以共存,而新版本不会破坏依赖于旧版本的其他程序的假设(比如操作系统提供的脚本)?这样做安全吗?使用virtualenv就够了吗?

在本地文件系统中,Python环境的不同组件(包括第三方包)应该放在哪里才是最好的选择?在许多不同版本的Unix和Windows操作系统中,这些位置是否有严格或大致的对应关系?

还有一个最复杂的问题——你使用什么安装工具(setuptools、distutils、pip等),它们和你选择的文件位置、Python虚拟环境、Python路径等配合得好吗?

这些听起来都是很难的问题。我希望有经验的Python开发者能为这些挑战定义出一种或两种标准的方法。任何能“连贯”地作为一个系统使用的方案(感觉不再像是分散的、不相关的工具)都会非常有帮助。

3 个回答

0

在这个领域,有一本书叫《专家级Python编程》,作者是Tarek Ziade。这本书的质量我觉得一般,但里面讨论的内容正好是你关注的主题。

8

我发现 virtualenv 是在同一台电脑上配置和管理多个环境的唯一可靠方法。它甚至可以把环境打包起来,然后在另一台电脑上安装。

在管理软件包方面,我总是使用 pip,因为它和 virtualenv 配合得非常好。使用它可以轻松地从各种来源,比如 git 仓库,安装和升级软件包。

3

我同意这个问题比较宽泛,但我还是尽量回答一下它的各个部分。

关于你主观的看法:我不明白为什么Python的简单和优雅就意味着打包和部署的事情应该变得简单。有些打包相关的事情确实简单,但有些则不然,还有一些可能会变得简单。对用户来说,最好是有一个完整、强大且易于使用的打包系统,但现实并不是这样。最开始有了distutils,然后它的发展暂停了,接着又有了setuptools,增加了新的解决方案和问题,之后因为一些社交问题又从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没有的东西,我会在我的用户site-packages目录中安装(或者放一个.pth文件到代码库里)。我不需要自定义PYTHONPATH,但我用PYTHONUSERBASE改变了我的用户site-packages的位置。我不喜欢setuptools/distribute中的魔法和egg的概念,所以我不使用它们。不过,我开始为一个项目使用virtualenv和pip(它们在后台使用setuptools,但我做了一个私有安装,这样我的全局Python就没有setuptools)。

撰写回答