摘要
您要处理的模块分为三类:
- 为OS软件包系统的所有用户安装的那些支持程序。(甚至可能包括人们使用Python进行编程时所使用的工具和库;请参见下文。)对于这些,您可以使用OS软件包,并
pip
在必要时安装到系统目录中。
- 由特定用户安装的那些支持程序,仅供其自己使用,也用于其“日常”使用Python作为脚本语言的某些方面。对于这些,她使用
pip --user
,或许pyenv或pythonz,以及类似的工具和策略。
- 那些支持特定应用程序的开发和使用。对于这些,您可以使用
virtualenv
(或类似的工具)。
这里的每个级别也可能会从上一个级别获得支持。例如,我们(2)中的用户可能依赖于通过OS软件包安装的Python解释器。
对此进行更详细的介绍:
系统程序和软件包
您想要“正常运行”的用Python编写的程序很简单:只需使用OS安装工具,然后将其随需携带即可;这与非Python程序没有什么不同。这可能会引入您的计算机上的用户可能开始依赖的Python工具/库(例如Python解释器本身!)。只要他们了解依赖关系,并且在理想情况下,知道在不提供依赖关系的主机上处理该依赖关系的替代方法,这就不是问题。
关于这种依赖关系的一个常见而简单的例子是我的一些以~/.local/bin/
开头的个人脚本#!/usr/bin/env python
。这些文件在RH / CentOS 7上可以正常运行(只要它们在Python 2下运行),并且大多数(但不是全部)Ubuntu安装都可以。它们不会在基本的Debian安装或Windows下进行。我不喜欢自己的个人环境非常依赖OS软件包(我在许多不同的OS上工作),因此我发现这样的事情是可以接受的。我在没有系统Python且无法安装Python的罕见主机上的备份计划是使用用户系统,如下所述。
使用系统python解释器的人通常也依赖于系统pip3
。那就是我通常在系统依赖项上划清界限的地方。从此以后,virtualenv
我都会处理自己。(例如,我的标准激活脚本依赖于任何pip3
或者pip
是路径,但下载自己的副本virtualenv
,以引导它的创建虚拟环境。
就是说,在某些情况下,使更多的开发环境可用是完全合理的。您可能已经将Python接口插入了复杂的程序包(例如DBMS)中,您想在其中使用该程序的系统版本,并且您感觉最好也让系统选择用于与之对话的特定Python库代码。或者,您可能会为Python类部署具有基本开发环境的大量主机,并发现使用标准系统软件包进行自动化最容易。
用户“日常”程序和软件包
用户可能拥有不太适合虚拟环境的Python库或程序,因为他们想首先帮助创建虚拟环境(例如virtualenvwrapper),或者它们是您通常在命令行中使用的东西做非Python的工作。即使他们确实具有安装这些工具的系统版本的能力,也可能会更舒适地安装自己的工具(例如,因为他们希望使用该工具的最新版本及其依赖项)。
pip --user
人们通常会为此使用什么,尽管某些依赖项(例如Python解释器本身)需要的更多。pyenv和pythonz对于构建个人解释器(无论是否安装~/.local/bin
为默认解释器)非常有用,当然,如果有可用的dev库,则总是可以从源代码“手动”构建。
我尝试保留此处安装的最少的东西:virtualenvwrapper(因为我经常使用它)以及最新版本的pip。我试图避免在标准库之外或在Python 3上依赖于我编写的可在许多主机上使用的个人脚本。(尽管随着越来越多的这些个人脚本移至Python,我们将看到可以忍受多长时间)。
单独的应用程序开发和运行时环境
这是通常的virtualenv事情。对于开发,您几乎应该始终使用virtualenv来确保您没有在使用系统依赖项,或者经常使用多个来针对不同的Python版本进行测试。
这些虚拟环境也非常适合具有很多依赖项的应用程序,在这些应用程序中您要避免污染用户环境。例如,我通常设置一个virtualenv来运行Jupyter笔记本之类的东西。