极简 Python:虚拟环境和 pip
我为什么要关心?
获取工具
创建虚拟环境
激活虚拟环境
pip 简介
离开虚拟环境
整个过程
虚拟环境和 Git
一些额外的技巧
总结
喜欢这些文章吗?那就买本书吧! Jason C. McDonald 的《Dead Simple Python》现已由 No Starch Press 出版。
虚拟环境。如果你曾经用 Python 做过任何有意义的工作,你几乎肯定听说过它。你甚至可能被告知它是不可或缺的。问题是,你根本不知道它是什么,更不知道如何创建它。
在我最初几十次尝试使用虚拟环境的时候,我犯了一个非常严重的错误。它们根本没用。我不愿意承认,但我甚至都不知道自己到底犯了什么错误!自从我学会了虚拟环境的工作原理后,就再也没遇到过任何问题了。
我为什么要关心?
虚拟环境(有时也称为virtualenv)是一个沙箱,您可以在其中仅安装所需的 Python 包。
“是的,包裹是什么?”
嗯,Python 以“功能齐全”而闻名。大多数事情只需一条简单的import
语句就能“完成”……
但是,如果您想要的不仅仅是内置包,该怎么办?例如,您可能想创建一个漂亮的用户界面,于是决定使用PySide2。PySide2与成千上万的其他第三方库一样,尚未内置于 Python 中,您必须自行安装它们。
值得庆幸的是,安装大多数第三方库都很容易!库的作者已经将整个库打包成一个包,可以使用一个名为 的便捷 Python 小工具进行安装pip
。(我们稍后会讲到。)
但这也正是棘手之处。有些软件包需要先安装其他软件包。某些软件包与其他软件包互不兼容。与此同时,你实际上可以根据具体需求安装特定版本的软件包。
我是否提到过,您系统上的某些应用程序和操作系统组件依赖于这些 Python 包?
如果你不小心,你就会陷入这种混乱……
这就是我们创建虚拟环境的原因!我们可以为每个项目创建一个不同的小沙盒,只安装我们需要的包,让所有内容井井有条。此外,我们实际上从未更改过系统上已安装的 Python 包,因此避免了破坏与项目无关的重要内容。
获取工具
让我们安装pip
和 (如果你的系统需要的话venv
)。为了举例说明,我们还将安装 Python 3。如果你已经安装了 Python 3,重新安装也没关系;否则,你可以跳过这一步。
Linux
在 Linux 上,您的发行版的软件包存储库几乎肯定有您需要的内容。
- Debian/Ubuntu:
sudo apt install python3-venv python3-pip
- Fedora:
sudo dnf python3-pip
苹果
在 Mac 上,您可以使用 Macports 或 Homebrew 进行安装。
这是适用于 Python 3.7 的 Macports。如果您想要 3.6,请将所有示例更改37
为36
以下内容……
sudo port install python37 py37-pip
sudo port select --set python python37
sudo port select --set pip py37-pip
这是 Homebrew...
brew install python
视窗
在 Windows 上,你只需要下载并安装Python。这也应该会自动安装pip
和venv
。
pip
但是,如果您尝试在命令行中运行,则应将get-pip.py下载到桌面上,在命令行上导航到该目录,然后通过 运行它python get-pip.py
。
呼!搞定这些,我们来进入最有趣的部分……创建虚拟环境!
创建虚拟环境
再次强调,虚拟环境就像一个沙盒,只包含你选择的软件包,并且(默认情况下)忽略系统上其他位置安装的所有 Python 软件包。每个虚拟环境都位于一个专用目录中。通常,我们将此文件夹命名为venv
。
对于每个项目,我通常喜欢在项目文件夹中创建一个专用的虚拟环境。(如果您使用的是 Git 或其他版本控制系统,稍后我们会讲解额外的设置步骤。)
要创建虚拟环境,我们首先在命令行中将工作目录更改为项目文件夹。(记住,这是cd
命令。)然后,我们一步创建虚拟环境及其目录。
在 UNIX 上...
python3 -m venv venv
该命令的最后一部分venv
是你为虚拟环境创建的目录的名称。从技术上讲,你可以随意命名它,但正如我之前提到的,venv
这是惯例。
注意,我们python3
在这里明确指定了我们想要使用的内容,尽管我们可以venv
使用我们想要使用的特定 Python 可执行文件(例如python3.6 -m venv venv
)来调用
如果您查看工作目录,您会注意到该目录venv/
已经创建。
激活虚拟环境
太好了,那么我们如何使用这个东西呢?
事实上,它非常简单。
在类 UNIX 系统(Mac、Linux 等)上,只需运行...
source venv/bin/activate
在 Windows 上,运行...
venv\Scripts\activate.bat
就像魔术一样,你现在正在使用你的虚拟环境!在 UNIX 系统上,你可能会(venv)
在命令行提示符的开头看到 ,表示你正在使用一个名为 的虚拟环境venv
。
当然,如果您将虚拟环境命名为其他名称,例如bob
,则需要相应地更改激活命令(source bob/bin/activate
)。
在具有多个 Python 版本的系统上使用虚拟环境的一大优点是,您不再需要在命令中指定路径。虚拟环境激活后,每次python whatever_your_command_is.py
都会使用您在创建时选择的 Python 版本venv
。
pip 简介
我们大多数人都对 Python 的包系统抱有很高的期望。(看到我做了什么吗?没看到?唉。)
pip
使用起来非常方便,比以前好用多了easy_install
。事实上,它以前非常笨重,以至于有人觉得需要创建一个叫做 的东西,但pip
现在使用起来非常轻松。
安装软件包
要安装一个包 - 比如pyside2
,只需运行...
pip install PySide2
如果您想安装某个特定版本,这也很容易。
pip install PySide2==5.11.1
>=
另外,你甚至可以使用诸如(“至少此版本或更高版本”)之类的运算符。这些被称为需求说明符。所以……
pip install PySide2>=5.11.1
会安装 PySide2 的最新版本,至少是5.11.1或更高版本。如果你想确保某个用户确实能够访问某个软件包的最低版本(他们可能没有),那么这个选项非常有用。
要求.txt
实际上,通过为项目编写一个文件,你可以为自己和他人节省更多时间requirements.txt
。在每一行中,列出包的名称pip
,就像你在命令中输入的那样install
。
例如,如果您有requirements.txt
这样的文件...
PySide2>=5.11.1
appdirs
...您可以一次性安装所有这些软件包...
pip install -r requirements.txt
很简单,对吧?
升级软件包
pip install
你可以使用命令和标志来更新已安装的软件包--upgrade
。例如,要安装最新版本的 PySide2,只需运行...
pip install --upgrade PySide2
您还可以使用以下方式一次性升级所有必需的软件包...
pip install --upgrade -r requirements.txt
删除软件包
删除东西同样简单。
pip uninstall PySide2
查找包
太好了,这样我们就可以安装、升级和删除东西了。但是我们怎么知道软件包pip
都提供了哪些功能呢?
有两种方法。第一种是直接用pip
它进行搜索。比如说,你想要一个网页抓取包。
pip search web scraping
这会给你一大堆需要筛选的结果,但如果你只是忘记了包的名称,它会很有帮助。
如果您想要一些更易于浏览和信息丰富的内容,PyPI.org是官方的Python 包索引。
最后的注释
安装虚拟环境所需的软件包后,就可以开始使用了!下次启动虚拟环境时,这些软件包仍然会像上次启动时一样,等待着您的使用。
关于 pip 的一个警告...
无论谁告诉你,永远、永远 、永远不要在 UNIX 系统上使用sudo pip
。它会对你的系统安装造成很多不良影响,以至于你的系统包管理器无法纠正,你会在系统的一生中后悔这个决定。
所有看似需要解决的问题都sudo pip
可以通过虚拟环境来解决。
朋友不会让朋友sudo pip
离开虚拟环境
太好了,那么你如何摆脱虚拟环境,回到现实……呃,咳咳,系统。
UNIX 用户,你们准备好了吗?
deactivate
我知道!很简单,对吧?
当然,在 Windows 上事情会稍微复杂一些……
venv\Scripts\deactivate.bat
嗯,还是挺轻松的。(记住,就像激活一样,如果你给虚拟环境起了个其他名字,那你也得相应地修改那一行。)
整个过程
最后再提一点小细节。你可能注意到了,大多数 Python 文件都以类似这样的内容开头……
#!/usr/bin/python
首先,这被称为“she-bang”(haSH-BANG 的缩写,或#!
),它允许脚本运行而无需python
附加到终端命令的开头。
其次,上面这句话非常非常错误。它强制计算机使用特定的系统级 Python 副本,这或多或少地把整个虚拟环境抛到了九霄云外。
相反,您应该始终对 Python3 脚本使用以下 she-bang:
#!/usr/bin/env python3
如果您碰巧有一个可以在 Python2 和 Python3 上运行的脚本,请使用:
#!/usr/bin/env python
python
(顺便说一下,关于vs. python2
、 vs.的规则python3
正式来自PEP 394。)
虚拟环境和 Git
venv
还记得之前关于您是否正在使用像 Git 这样的 VCS 的警告吗?
虚拟环境的目录中存放着你实际安装的软件包pip
。这些软件包会在你的仓库里堆积大量不必要的大文件,而且你也不能指望将虚拟环境文件夹从一台电脑复制到另一台电脑后还能正常工作。
因此,我们不想在版本控制系统 (VCS) 中跟踪这些文件。在 Git 中,你会.gitignore
在仓库的根目录中找到一个名为 的文件。创建或编辑该文件,并在其中的某个位置添加以下行……
venv/
当然,如果您对虚拟环境使用了不同的名称,则需要更改该行以进行匹配。
按照惯例,每个克隆您的存储库的开发人员都会构建他们自己的虚拟环境,可能使用requirements.txt
您创建的文件。
如果您使用不同的 VCS,例如 Subversion 或 Mercurial,请查看文档以了解如何忽略类似目录venv
。
但...
很多 Python 开发者可能会对你把虚拟环境放在仓库文件夹里深感不满。我上面方法的主要缺点是,如果你给虚拟环境起了任何名字( venv
或者你在 中输入的任何内容.gitignore
),它都会被提交,这很糟糕。
最好的习惯其实是把虚拟环境完全放在仓库目录之外。但说实话,我们大多数人其实并没有这么做。只是觉得用“错误”的方式更方便而已。
这就是我们添加venv
到的原因.gitignore
。您或其他人可能会将虚拟环境粘贴在存储库目录中,因此这有助于防止一些意外提交。
一些额外的技巧
我在 Freenode IRC 上的一些 Python 开发人员朋友以及评论中的人们指出了一些对虚拟环境用户有帮助的额外技巧。
Python 3.3 之前
此venv
命令仅在使用 Python 3.3 或更高版本时有效。在此之前,您需要从 pip 安装一个名为 的包virtualenv
。如果需要使用该包,请参阅virtualenv
文档。
如果您的系统同时安装了 Python 2 和 Python 3,请确保使用python3 -m venv
合适的 或 。此技巧在 Python 3.6 之前的任何版本上均无效。
无需激活即可使用虚拟环境
您还可以使用虚拟环境中的二进制文件,而无需实际激活它。例如,您可以执行venv/bin/python
来运行虚拟环境自身的 Python 实例,或者venv/bin/pip
运行它的 实例pip
。它实际上的工作方式与您激活虚拟环境时一样!
例如,我可以这样做(假设我的虚拟环境是venv
)...
venv/bin/pip install pylint
venv/bin/python
>>> import pylint
……它真的能用了!不过,它import pylint
仍然无法在系统级 Python shell 上运行……当然,除非你把它安装到系统上。;)
替代方案
我听到了很多关于使用 的建议pipenv
,包括在评论区。我不会在本文中介绍它,但它的工作流程简洁明了,而且有很多忠实的粉丝。你可以在这里了解更多信息:PyPI 上的 pipenv
总结
我希望本指南能彻底揭开虚拟环境的神秘面纱,也pip
希望您能有所收获。当然,我建议您将这份文档放在枕头下:
Chris Warrick 还写了一篇很棒的文章,介绍了虚拟环境的其他一些方面:五分钟了解 Python 虚拟环境
漫画由XKCD提供
感谢grym
、、deniska
和ChrisWarrick
(Freenode IRC #python
)提出的修改建议。