学堂 学堂 学堂公众号手机端

超简单的Python教程系列——第2篇:虚拟环境和 pip(超简单的python代码)

lewis 6年前 (2019-06-15) 阅读数 11 #技术

虚拟环境。如果你曾经在 Python 中做过任何有意义的工作,那么你几乎肯定听说过这些。很有可能,你甚至被告知它们是毋庸置疑的。麻烦的是,你不知道它们是什么,更不用说如何制作它们了。

在我尝试使用虚拟环境的前几十次尝试中,我设法得到了一些可怕的错误,并进行了归纳总结。自从我了解了虚拟环境的工作原理后,我就没有遇到过任何问题。


我为什么要关注?

虚拟环境(有时称为virtualenv)是一个沙箱,你可以在其中仅安装所需的 Python 包。

“是啊,什么是包?”

好吧,Python 以“扩展包”而闻名。​​import​​​大多数事情都可以通过一个简单的语句“正常工作” ......​

但是,如果你想要的不仅仅是内置软件包怎么办?例如,你可能想要创建一个时髦的用户界面,并决定使用PySide2。PySide2 与其他数千个第三方库一样,还没有内置到 Python 中——你必须安装它们。

值得庆幸的是,安装大多数第三方库很容易!库的作者已经将整个库捆绑到一个中,可以使用一个方便的 Python 小工具​​pip​​.(我们稍后会谈到。)

但这就是棘手的地方。有些软件包需要先安装其他软件包。某些软件包不喜欢某些其他软件包。同时,你实际上可以安装特定版本的软件包,具体取决于你的具体需要。

我有没有提到你系统上的一些应用程序和操作系统组件依赖于那些 Python 包?

如果你不小心,你最终会陷入这种混乱......

这就是我们有虚拟环境的原因!我们可以为每个项目创建一个不同的小沙箱,只安装我们想要的包,并保持一切井井有条。奖励,我们从来没有真正改变我们系统上安装的 Python 包,所以我们避免破坏与我们的项目无关的重要事情。


获取工具

让我们安装​​pip​​​和(如果你的系统需要,​​venv​​)。只是为了举例,我们还将安装 Python 3。如果你已经安装了它,重新安装也无妨;否则,你可以跳过该部分。

Linux

在 Linux 上,你的发行版的软件包存储库几乎肯定有你需要的东西。

Debian/Ubuntu:​​sudo apt install python3-venv python3-pip​​Fedora:​​sudo dnf python3-pip​​Centos:​​yum install python3 python3-pip​


Mac

在 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

在 Windows 上,你只需要​​下载并安装​​​Python。这也应该自动安装​​pip​​​和​​venv​​.

但是,如果你尝试​​pip​​​在命令行中运行,你应该将​​get-pip.py​​​下载到你的桌面上,在你的命令行上导航到该目录,然后通过​​python get-pip.py​​.

哇!说完这些,让我们进入有趣的部分……创建虚拟环境!


创建虚拟环境

再一次,虚拟环境就像一个沙箱,只包含你选择的包,并忽略(默认情况下)安装在系统其他位置的所有 Python 包。每个虚拟环境都驻留在一个专用目录中。按照惯例,我们将此文件夹命名为​​venv​​。

对于每个项目,我通常喜欢在项目文件夹中创建一个专用的虚拟环境。(如果你使用的是 Git 或其他 VCS,我们稍后会介绍一个额外的设置步骤。)

要创建虚拟环境,我们首先将命令行中的工作目录更改为项目文件夹。(记住,这是​​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​​​将使用你在创建​​venv​​.每次。


介绍PIP

我们大多数人都对 Python 的包系统寄予厚望。(看看我在那里做了什么?没有?。)

​pip​​非常容易使用,而且比过去糟糕的时候要容易得多。事实上,它曾经非常笨重,以至于有人觉得他们需要创建一个名为​​easy_install​​​的东西,但​​pip​​现在使用起来非常轻松。


安装包

要安装一个包 - 比如说​​pyside2​​,只需运行...

pip install PySide2

如果你想安装某个特定版本的东西,那也很容易。

pip install PySide2==5.11.1

奖励,你甚至可以使用诸如​​>=​​(“至少此版本或更高版本”)之类的运算符。这些被称为需求说明符。所以这...

pip install PySide2>=5.11.1

将安装至少为5.11.1 或更高版本的最新版本的 PySide2 。如果你想确保某人实际上可以访问软件包的最低版本(他们可能没有),这真的很有帮助。


requirements.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/LINUX系统上使用​​sudo pip​​。它会对你的系统安装造成很多坏事,以至于你的系统包管理器无法修复,你将在系统的生命周期内为这个决定感到遗憾。

所有​​sudo pip​​似乎要解决的问题都可以通过虚拟环境来解决。

千万记住不要sudo pip


退出虚拟环境

太好了,那么你如何退出虚拟环境,回到现实……呃,咳咳,系统。

UNIX 用户,你准备好了吗?

deactivate

我知道!很简单,对吧?

当然,Windows 上的情况稍微复杂一些……

venv\Scripts\deactivate.bat

嗯,还是很简单的。(请记住,就像激活一样,如果你将虚拟环境命名为其他名称,则必须相应地更改该行。)


She-Bang

所以,最后一个小细节。你可能已经注意到大多数 Python 文件都以类似...

#!/usr/bin/python

首先,这称为“she-bang”(haSH-BANG 或 的缩写​​#!​​​),它允许脚本在不​​python​​附加到终端命令开头的情况下运行。

其次,上面那句话是非常非常错误的。它迫使计算机使用特定系统范围的 Python 副本,这或多或少地将整个虚拟环境的东西抛到了窗外。

相反,你应该始终对 Python3 脚本使用以下 she-bang:

#!/usr/bin/env python3

如果你碰巧有一个同时在 Python2 和 Python3 上运行的脚本,请使用:

#!/usr/bin/env python


虚拟环境和 Git

还记得之前的警告,关于​​venv​​你是否使用像 Git 这样的 VCS?

在虚拟环境的目录中是你安装的实际包​pip​​。这些会使你的存储库中包含大量不必要的文件,并且你不一定将虚拟环境文件夹从一台计算机复制到另一台计算机并期望它无论如何都能正常工作。

因此,我们不想在 VCS 中跟踪这些文件。在 Git 中,你将​​.gitignore​​在存储库的根目录中调用一个文件。创建或编辑该文件,并将此行添加到其中的某处...

venv/

自然,如果你为虚拟环境使用不同的名称,你会更改该行以匹配。

按照惯例,每个克隆你的存储库的开发人员都将构建他们自己的虚拟环境,可能会使用​​requirements.txt​​你创建的那个文件。

如果你使用不同的 VCS,例如 Subversion 或 Mercurial,请查看文档以了解如何忽略​​venv​​.


但是...

许多 Python 开发人员可能会对你将虚拟环境完全放在存储库文件夹中而深深皱眉。我上面的方法的主要缺点是,如果你将虚拟环境命名为除此之外的任何名称​venv​​​或你放入的任何内容​​.gitignore​​,它都会被提交,这很糟糕。

最好的习惯实际上是将你的虚拟环境完全排除在存储库目录之外。但是,如果我们说实话,我们大多数人实际上都没有。以“错误”的方式做这件事感觉更方便。

这就是我们添加​​venv​​​到​​.gitignore​​. 你或其他人可能会将虚拟环境粘贴在你的存储库目录中,因此这仅有助于防止一些意外提交。


一些额外的技巧在 Python 3.3 之前

该​​venv​​​命令仅在你使用 Python 3.3 或更高版本时才有效。在此之前,你需要一个来自 pip 的名为​​virtualenv​​​.如果你需要使用它,请参阅的​​​virtualenv文档。​​

如果你在一个同时使用 Python 2 和 Python 3 的系统上,请确保使用​​python3 -m venv​​或任何合适的。此技巧不适用于 3.6 之前的任何 Python 版本。


在不激活的情况下使用虚拟环境

你还可以使用作为虚拟环境一部分的二进制文件,而无需实际激活它。例如,你可以执行​​venv/bin/python​​​来运行 virtualenv 自己的 Python 实例,或者​​venv/bin/pip​​​运行它的​​pip​​.它实际上就像你激活了虚拟环境一样工作!

例如,我可以这样做(假设我的虚拟环境是​​venv​​)......

venv/bin/pip install pylint
venv/bin/python

>>> import pylint

......它的工作原理!然而,​​import pylint​​仍然无法在系统范围的 Python shell 上工作......当然,除非你在系统上安装了它。


替代方案

我听到了很多关于使用的建议​​pipenv​​​,包括在评论部分。我不会在本文中介绍它,但它的工作流程看起来很整洁,并且有很多声乐爱好者。你可以在这里找到更多信息:​​PyPI 上的 pipenv​​


总结

我希望本指南完全揭开虚拟环境的神秘面纱并​​pip​​为你服务。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门