Pip和Virtualenv对Python初学者的非魔法介绍

https://www.dabapps.com/blog/introduction-to-pip-and-virtualenv-python/

 

新Python开发人员必须克服的障碍之一是理解Python包装生态系统。这篇博客文章基于Python for Programmers培训课程中介绍的内容,该课程试图为新的Python用户解释pipvirtualenv

先决条件

Python for Programmers面向已经熟悉一种或多种编程语言的开发人员,因此我们假设了一定的技术知识。如果您对命令行感到相当舒服,这将有所帮助。以下示例使用bash,这是Mac和大多数Linux系统上的默认shell。但是命令很简单,概念应该可以传输到任何终端,例如PowerShell for Windows。

果仁

让我们深入了解.pip是一个从Python Package Index安装Python包的工具

PyPI(您偶尔会看到称为The Cheeseshop)是开源第三方Python包的存储库。它类似于Ruby世界中的RubyGems,PHP的Packagist,Perl的CPAN和Node.js的NPM。

Python实际上有另一个更原始的包管理器easy_install,它在你自己安装Python时会自动安装。easy_install由于很多原因,pip非常优越,因此通常应该使用它。你可以使用easy_install如下安装pip:

1
$ sudo easy_install pip

然后你可以按如下方式安装pip包(在这个例子中,我们正在安装Django):

1
2
#不要这样做
$ sudo pip install django

在这里,我们在系统上全局安装Django 但在大多数情况下,您不应该全局安装软件包请继续阅读以找出原因。

的virtualenv

virtualenv解决了一个非常具体的问题:它允许多个具有不同(通常是冲突的)要求的Python项目在同一台计算机上共存。

它解决了什么问题?

为了说明这一点,让我们首先假装virtualenv不存在。想象一下,我们将编写一个需要向远程Web服务器发出HTTP请求的Python程序。我们将使用Requests库,这对于那种事情来说非常棒。如上所述,我们可以使用pip来安装Requests。

但是在您的计算机上pip安装软件包的位置是什么?如果我尝试运行会发生以下情况pip install requests

1
2
3
4
6
7
8
9
$ pip安装请求
下载/解压缩请求
  正在下载请求-1.1.0.tar.gz  337Kb :已下载337Kb
  运行setup.py egg_info 以获取包请求

安装收集的包:请求
  运行的setup.py安装请求

    错误:无法创建'/Library/Python/2.7/site-packages/requests':权限被拒绝

哎呀!它看起来像是pip试图安装包/Library/Python/2.7/site-packages/requests这是Python知道的特殊目录。site-packages安装的任何内容都可以由您的程序导入。

我们看到错误是因为/Library/(在Mac上)通常不能被“普通”用户写入。要修复错误,我们可以运行sudo pip install requestssudo意味着“以超级用户身份运行此命令”)。一切都会好起来的:

 1
 2
 3
 4
 6
 7
 8
 9
10
$ sudo pip安装请求
密码:
下载/解压缩请求
  运行setup.py egg_info 以获取包请求

安装收集的包:请求
  运行的setup.py安装请求

已成功安装请求
打扫干净...

这次它奏效了。我们现在可以输入python并尝试导入我们的新库:

1
2
3
>>> 导入 请求
>>> 请求get 'http://dabapps.com' <Response [200]>

所以,我们现在知道我们可以import requests在我们的程序中使用它。我们继续在我们的新程序上狂热地工作,使用requests(也可能是PyPI的许多其他库)。该软件运行良好,我们赚了很多钱,我们的客户印象深刻,他们要求我们编写另一个程序来做一些稍微不同的事情。

但是这一次,我们找到了一个全新的功能,requests因为我们编写了第一个我们真正需要在第二个程序中使用的程序。因此我们决定升级requests库以获得新功能:

1
sudo pip install --upgrade requests

一切似乎都很好,但我们在不知不觉中创造了一场灾难!

下次我们尝试运行它时,我们发现我们的原始程序(使我们负担大量的程序)完全停止工作,并在我们尝试运行它时引发错误。为什么?因为requests的API中的某些内容在之前的版本和我们刚刚升级到的版本之间发生了变化它可能只是一个小变化,但这意味着我们的代码不再正确使用库。一切都被打破!

当然,我们可以在我们的第一个程序中修复代码以使用新版本的requestsAPI,但这需要时间并分散我们对新项目的注意力。而且,当然,经验丰富的Python程序员不会仅仅有两个项目,但几十家 -每个项目可能有几十依赖!让它们保持最新并与每个的相同版本一起工作将是一场彻头彻尾的噩梦。

virtualenv如何帮助?

virtualenv通过为每个程序创建一个完全隔离的虚拟环境解决这个问题环境只是一个目录,其中包含运行Python程序所需的所有内容的完整副本,包括python二进制文件本身的副本,整个Python标准库的副本,pip安装程序的副本以及(关键)副本site-packages上面提到目录。当您使用从PyPI将安装包复制pip那个年代由创建virtualenv工具,将包安装到site-packages目录里面的的virtualenv目录。然后,您可以像以前一样在程序中使用它。

我该如何安装virtualenv?

如果您已经拥有pip,最简单的方法是全局安装它sudo pip install virtualenv通常pipvirtualenv你仅有的两个包永远需要在全球范围内安装,因为一旦你已经有了这两个,你可以做虚拟环境中的所有工作。

事实上,virtualenv 的副本pip会被复制到您创建的每个新环境中,因此virtualenv您真正需要的就是它。您甚至可以将其作为单独的独立包(而不是PyPI)安装。对于Windows用户来说,这可能更容易。有关说明,请参见virtualenv.org

如何创建新的虚拟环境?

virtualenv当您想要创建新环境时,您只需要工具本身这很简单。首先将目录更改为项目目录的根目录,然后使用virtualenv命令行工具创建新环境:

1
2
3
4
$ cd ~ / code / myproject /
$ virtualenv env
env / bin / python中的新python可执行文件
安装setuptools ............完成。
安装pip ...............完成。

这里,env只是您要在其中创建虚拟环境的目录的名称。调用此目录env并将其放在项目目录中是一种常见的约定(因此,假设您保留代码~/code/projectname/,环境将在~/code/projectname/env/- 每个项目都有自己的env)。但你可以随心所欲地把它叫做,把它放在任何你喜欢的地方!

注意:如果您使用的是版本控制系统git,则不应提交env目录。将其添加到您的.gitignore文件(或类似)。

如何使用闪亮的新虚拟环境?

如果您查看env刚刚创建目录,您将看到一些子目录:

1
2
$ ls env
bin包括lib

你最关心的是bin这是python二进制文件和pip安装程序的本地副本所在的位置。让我们首先使用pip安装requests  virtualenv(而不是全局)的副本

 1
 2
 3
 4
 6
 7
 8
 9
10
$ env / bin / pip安装请求
下载/解压缩请求
  正在下载请求-1.1.0.tar.gz  337kB :已下载337kB
  运行setup.py egg_info 以获取包请求

安装收集的包:请求
  运行的setup.py安装请求

已成功安装请求
打扫干净...

有效!请注意,我们并不需要使用sudo这个时候,因为我们没有安装requests全球范围内,我们只是安装它我们的家目录内。

现在,我们不是键入python来获取Python shell,而是env/bin/python...

1
2
3
>>> 导入 请求
>>> 请求get 'http://dabapps.com' <Response [200]>

但这是很多打字!

virtualenv还有一个技巧。相反,打字env/bin/pythonenv/bin/pip每一次,我们可以运行一个脚本来激活环境。这个脚本,它可以被执行source env/bin/activate,只是在调整你的shell(暂时的),这样当你键入一些变量python,你实际上得到了Python二进制里面的virtualenv中,而不是全球性的:

1
2
3
4
$ python
在/ usr / bin中/蟒蛇
$ source env / bin / activate
$ python
/用户/杰米/代码/ myproject的/ env的/ bin中/蟒

所以现在我们可以运行pip install requests(而不是env/bin/pip install requests)并将pip库安装到环境中,而不是全局安装。只有在终端打开时,对shell的调整才会持续,因此source env/bin/activate每次关闭并打开终端窗口时都需要记住重新运行如果切换到其他项目(具有自己的环境),则可以运行deactivate以停止使用一个环境,然后source env/bin/activate激活另一个环境

激活和停用环境可以节省一点点打字,但它有点“神奇”,可能会令人困惑。自己决定是否要使用它。

需求文件

virtualenv和pip是很好的伙伴,特别是当你使用requirementspip 功能时。您处理的每个项目都有自己的requirements.txt文件,您可以使用它来将该项目的依赖项安装到其虚拟环境中:

1
env / bin / pip install -r requirements.txt

有关详细信息,请参阅pip文档

概括

  • pip是一个用于从Python Package Index安装包的工具。
  • 的virtualenv是创建包含自己的副本隔离的Python环境的工具pythonpip和自己的位置,以保持一封来自PyPI安装库。
  • 它旨在允许您在同一台计算机上同时处理具有不同依赖关系的多个项目。
  • 您可以在virtualenv.org上查看安装说明
  • 安装后,运行virtualenv env以在名为的目录中创建新环境env
  • 每个项目都需要其中一个环境。确保从版本控制系统中排除这些目录。
  • 要使用环境python版本pip内部的版本,请分别键入env/bin/pythonenv/bin/pip
  • 您可以使用“激活”环境source env/bin/activate并停用其中一个deactivate这完全是可选的,但可能会让生活变得更轻松。

如果你是一个普通的Python用户,pip和virtualenv是不可或缺的工具。两者都很容易理解,我们强烈建议您掌握它们。

如果这篇博文引起了您对学习Python的兴趣,请查看我们位于布莱顿的DabApps HQ的Python for Programmers研讨会。

posted @ 2019-02-17 22:29  chenlife  阅读(134)  评论(0)    收藏  举报