本文介绍了Python开发中常用的工具,如virtualenv和pip,强调了它们在安装、管理包和创建隔离环境方面的优势。还提供了在CentOS上安装Python和相关工具的步骤,以及如何在实际项目中使用这些工具进行包管理。
简介
在使用 Python 进行应用程序开发时,经常会听到一些工具在各个地方或开源代码中被频繁提及。尽管这些工具被广泛使用,但有时很难找到一个好的手册来逐步指导你,而这对于熟悉这些重要且必需的工具至关重要。
在这篇 DigitalOcean 文章中,我们旨在向您介绍不仅基础知识,还有在实际场景中使用这些流行的 Python 工具和项目的逻辑。我们将从下载和安装一些常见的库开始,设置和使用虚拟环境(使用 virtualenv),以及管理自己应用程序的开发和生产所需的包。
本文旨在面向初学者以及那些希望获得更深入知识的人。如果您想了解更多,请随时在下面的评论部分提出建议。
Python 在 CentOS 上
请记住,如果您使用的是 CentOS/RHEL 系统,应避免使用操作系统自带的默认 Python 解释器。相反,您应该选择自己安装 Python。
如果您还没有这样做,并且想了解如何操作,请参阅我们的教程:在开始之前,请查看我们的教程:在 CentOS 6.4 上设置 Python 2.7.6 和 3.3.3。
同样,在 CentOS 上使用自定义 Python 安装安装 pip 和 virtualenv,您可以按照该文章中的说明进行操作。
Python 和包
尽管 Python 应用程序可以由单个文件构成,通常它们由一系列函数、对象(类)、方便的工具和当然,分布在多个文件中的变量组成,这些文件被放置在模块中。这些模块一起组成了所谓的**包**。
传统的安装包的方式涉及首先找到它,然后下载。这听起来很简单,因为实际上在 Python 中许多事情都是如此,但它并不完美。
当文件准备好并解压缩后,使用**distutils**模块,您可以通过调用 setup.py
来安装它:
安装包的示例:
# 示例:cd [包名] cd a_package python setup.py install
distutils(分发工具)是用于打包和分发代码的工具集。它默认与 Python 一起提供(即包含在标准库中)。
尽管上述过程的简单性,如果在安装抽象化的挑战存在于流程的其他地方,那么它就没有用处:查找和管理它们。这就是包管理通过工具进行的地方 - 带来了许多好处,比如:
- 卸载(例如
pip uninstall package_x
), - 版本控制(例如
pip install django==x
), - 以及自动依赖管理(因为包可能依赖于其他包)。
包管理
Python 中的包可以是工具、库、框架和应用程序。鉴于该语言的流行和美丽,有成千上万的包可供您为自己的项目使用。
包管理工具
最常见的 Python 包管理器是**pip和easy_install**。它们都旨在帮助用户完成以下任务:
- 下载、安装和卸载
- 构建
- 管理 Python 包等等
从外部看,它们两者可能看起来做着相同的事情,它们对共同库**setuptools**的依赖增加了这种观念。
然而,在这种情况下,隐藏在眼前的东西使得它们之间存在差异 - 而且还有很多差异。
pip vs easy_install
为此任务创建的第一个工具是easy_install。尽管与手动操作相比,它是一种解脱和愉悦,但随着时间的推移,它在某些方面已被证明存在问题。这为pip的开发创造了基础,它是另一个包管理器。
pip(由项目本身定义)是easy_install的替代品,相比前者带来了许多优点,包括但不限于:
- 在安装之前下载所有内容
- 在过程中提供有用的反馈
- 保持正在执行的操作历史记录
- 提供有用的错误消息,遵循 Python 传统
- 与**virtualenv**相辅相成,并且与之非常良好地配合
要了解有关pip的更多信息,请考虑阅读其介绍,位于 PyPI 包索引,点击此处。
详细的 pip 使用方法
在本节中,我们将讨论获取pip的必要依赖项,安装其最新版本,然后逐步介绍其提供的核心功能,如安装、卸载、冻结和管理要求。
我何时会使用pip?
正如在介绍中承诺的那样,我们旨在为您提供真实场景的示例。
想象一下,您正在开发一个小型应用程序。您已经制定了一项路线图,一切都进行得很顺利。然后,您发现了一个库(或模块),如果将其包含在您的应用程序中,它可以帮助您很多。您可以按照我们所解释的传统方式进行下载。但是,一旦您不仅需要处理一个包,而是 3 个、4 个甚至 20 个包,这个过程就变得繁琐。包括管理它们(例如更新、卸载、替换、使用不同版本),您可以看到您需要处理的问题,而使用pip,这些问题就变得多余。
安装 pip
为了安装 pip,我们首先需要处理它的依赖关系。不过不用担心,这很容易。
setuptools
正如上面所解释的,pip 的一个依赖是 setuptools 库。它建立在 Python 的 分发工具 工具集(称为 distutils)的(标准)功能之上。鉴于 distils 是默认提供的,我们所需要的只剩下 setuptools。
我们将使用 curl
安全地下载 setuptools 的设置文件。cURL 是一个系统库,允许在各种协议上进行数据传输(即数据交换的通用语言,如 HTTP)。它将验证源自的 SSL 证书并将数据传递给 Python 解释器。
这些设置文件,Python 解释器将执行,自动化安装过程,因为它们在我们的系统上设置了最新的稳定版本。
执行以下命令:
curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python -
这个安装使我们能够在整个系统中全局使用 pip。然而,这不是安装任何其他包的首选方式。推荐的方式是始终使用自包含的 Python 环境,virtualenv。我们将在下一节中讨论它。
注意: 你可能需要明确获得 超级用户 权限才能继续下载。在这种情况下,考虑使用:
curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | sudo python -
在安装了它的单个依赖之后,我们现在可以继续下载和设置 pip。
我们将再次使用 curl
安全地下载并安装设置文件。
执行以下命令:
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python -
pip 的默认安装文件夹位于:
/usr/local/bin
为了在不指定完整路径的情况下使用它,必须将其附加到 PATH。
更新 PATH:
export PATH="/usr/local/bin:$PATH"
完成这一步后,我们就可以开始使用 pip 了。
使用 pip
使用 pip 真的很有趣,可以说是无忧无虑的。如果你过去曾经遇到过极其不必要的问题,甚至不明白为什么,pip 将确保它们在这里最小化。
使用 pip 安装包
pip 可以做很多事情,但可以毫不夸张地说,它最常用的功能是 安装包。它有几种处理这项工作的方式。
查找并安装包:
# 示例:pip install [包名] # 让我们安装优秀的 *requests* 库 pip install requests
查找并安装特定版本:
# 示例:pip install [包名]==[版本] # 让我们安装 requests 的 2.0.0 版本 pip install requests==2.0.0
从 URL 或 VCS 存储库安装:
# 示例:pip install [url] # 让我们安装 virtualenv pip install https://github.com/pypa/virtualenv/tarball/1.9.X
在 virtualenv 中安装:
# 示例:pip install [env 名称] [包名] # 这将在环境内安装,或创建一个环境 # 让我们在名为 *venv* 的虚拟环境中安装 requests pip install -E venv requests
使用 pip 卸载包:
pip 的第二常用功能可能是卸载包。
卸载包:
# 示例:pip uninstall [包名] # 让我们移除 requests 库 pip uninstall requests
使用 pip 升级包
如果你打算卸载以安装应用程序的新版本,你可以尝试 升级。
升级包:
# 示例:pip install --upgrade [包名] # 让我们升级 requests 库 pip install --upgrade requests
使用 pip 搜索包
在决定移除或升级包之前,你可能需要先 搜索 一个。
搜索包:
# 示例:pip search [包名] # 让我们找到所有 django 包 # 这可能需要一些时间(有很多!) pip search django
使用 pip 创建已安装包的列表
pip 最真正出色和救命的能力之一是能够轻松地创建已安装的 包列表 的列表(“冻结”)。根据你的 Python 环境(无论是虚拟还是全局),pip 将使用一个命令创建列出所有已安装包的文件。
创建一个新的列表(“冻结”):
注意: 这个命令将在当前工作目录中输出一个文件。
# 示例:pip freeze > [文件名.ext] # 让我们列出当前安装的所有包 pip freeze > package_list.txt
在模板之上创建一个列表(“冻结”):
注意: 这个命令将在当前工作目录中输出一个文件。
# 示例:pip freeze -r [现有文件.ext] > [文件名.ext] # 让我们在上次冻结后附加新安装的包 pip freeze package_list.txt > package_list_new.txt
使用 pip 安装列表中的所有软件包
当您在应用程序中工作时,最好是在虚拟环境中,您将在其中安装所有依赖项(必需软件包)。在使用 freeze 提取出它们的列表后,您可以使用 install 再次安装它们。
安装列表中的所有软件包(“freeze”):
# 示例:pip install -r [文件名.ext] # 让我们从先前的示例中重新安装所有软件包 pip install -r package_list_new.txt
一个全面的 virtualenv 指南
让我们首先定义一下 virtualenv 到底是什么,以及它适用的情况。
virtualenv:
在 Python 的世界中,一个 环境 是一个包含了一个 Python 项目(应用程序)运行所需的一切内容的文件夹(目录),以有组织、隔离的方式运行。当它被初始化时,它会自动带有自己的 Python 解释器 - 一个创建它时使用的副本 - 以及它自己的 pip。
virtualenv 解决了许多问题:
- 为 Python 项目创建一个新的、隔离的环境
- 能够在不需要管理员/超级用户权限的情况下下载软件包
- 轻松打包应用程序
- 创建属于使用 pip 创建的单个项目的依赖项列表
- 使用 pip 创建的要求文件轻松恢复依赖项
- 在系统之间实现可移植性
使用 virtualenv 是处理 Python 项目的 推荐 方法,无论您可能忙于处理多少个项目。它非常易于使用,是一个非常好的工具。与 pip 结合使用时效果非常好。
我们将从系统中安装 virtualenv 开始。
安装 virtualenv
为了安装 virtualenv,我们将使用 pip 来帮助。我们将其安装为全局可用的包,以供 Python 解释器运行。
有两种方法可以获取该应用程序。您能够获得的版本取决于您选择的方法。
最简单的方法是使用 pip 进行搜索、下载和安装。这可能 不 会为您提供最新的稳定版本。
使用 pip 下载 virtualenv:
# 示例:[sudo] pip install virtualenv sudo pip install virtualenv
使用 curl 下载最新版本:
virtualenv 的最新版本是 1.11.X
。
# 示例:[sudo] pip install [github 仓库]/[版本] sudo pip install https://github.com/pypa/virtualenv/tarball/1.1.X
使用 virtualenv
使用该工具包括让它创建一个包含 Python 解释器和 pip 副本的文件夹。之后,为了使用它,我们需要指定该解释器的位置或者 activate
它。
您使用虚拟环境内的解释器安装的所有应用程序都将放置在该位置。
当您使用 pip 创建它们的列表时,只有文件夹内的应用程序会被编译到文件中。
记住: 当您完成一个环境的工作后,在切换到另一个环境之前 - 或者使用全局安装的环境时 - 您需要确保
deactivate
它。
创建 / 初始化 虚拟环境(virtualenv)
使用与运行它的相同解释器创建环境:
# 示例:virtualenv [文件夹(env.)名称] # 让我们创建一个名为 *my_app* 的环境 virtualenv my_app
使用自定义 Python 解释器创建环境:
# 示例:virtualenv --python=[loc/to/python/] [env. 名称] virtualenv --python=/opt/python-3.3/bin/python my_app
激活 虚拟环境
# 示例:source [env. 名称]/bin/activate # 让我们激活刚刚创建的 Python 环境 source my_app/bin/activate
在不激活的 虚拟环境 中工作
出于各种原因,您可能选择在使用之前不激活环境。这样可以增加您运行的命令的灵活性,但是,您需要确保每次都针对正确的解释器。
# 示例:[env. 名称]/bin/python [参数] my_app/bin/python python_script.py
在不激活的环境中使用 pip 安装
# 示例:[env. 名称]/bin/pip [命令] [参数] # 在不激活环境的情况下安装 requests 库 my_app/bin/pip install requests
停用 虚拟环境:
# 示例:deactivate # 让我们停用之前的环境 deactivate