老白最近给朋友们讲解NLP顺带做了点Python的介绍。虽然大家都或多或少的使用过Python(大部分都不是Python 工程师)但是老白还是惊讶的发现有不少同事并不知道virtualenv每次搞Python都是随便玩玩然后就把系统搞得乱七八糟的了。因此老白给大伙普及了下virtualenv这个神器顺带也写下这篇文章。这篇的内容主要包含了pipvirtualenv和requirements.txt文件完全基础仅供Python新手们学习有Python经验的同学可以绕道而行_。
什么是pip
pip是一个从Python Package Index(PyPI)安装Python软件包的管理器。这里的PyPI就是一个Python第三方开源仓库。
如果大家有其他语言的背景那么可能会对包管理器的概念比较熟悉。JavaScript 使用 npm 管理软件包Ruby 使用 gemJava使用Maven以及 .NET 使用 NuGet。Python 中则是 pip 作为标准包管理器。
Python其实最开始还有一个比较原始基础的包管理器easy_install。但是其渐渐被淘汰了老白也不建议大家去花过多时间了解。也正是因为pip越来越重要自从Python3.4和Python2.7.9之后的版本pip都是默认包含在Python的安装包中的。如果使用的是之前的版本可以通过easy_install pip来进行安装pip(是不是略显讽刺easy_install安装一个工具来替代自己)。
easy_install pip
有了pip之后我们就可以通过类似以下的命令来安装软件包了
#千万先别运行
pip install django
这里我们将Django进行了全局安装(全局安装意味着安装完之后将对所有的应用可见)。但是在大部分情况下我们并不希望进行全局安装。可以在下面的例子中看到并不是每个应用都会使用同一个版本的软件包全局安装将会使得软件的运行环境混乱不堪。
virtualenv解决了什么问题
virtualenv解决了一个非常具体的问题其允许了多个Python项目在同一台电脑上同时开发并且使用不同的运行环境。
为了更好的说明这个问题我们可以假设virtualenv这个功能并不存在。当我们需要写一个具有HTTP请求的Python程序时我们需要使用到Requests这个包我们可以通过上面提到的pip命令进行安装Requests。
$ pip install requests
Collecting requests
Using cached requests-2.24.0-py2.py3-none-any.whl (61 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
Using cached urllib3-1.25.9-py2.py3-none-any.whl (126 kB)
Collecting idna<3,>=2.5
Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting chardet<4,>=3.0.2
Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting certifi>=2022.4.17
Using cached certifi-2022.6.20-py2.py3-none-any.whl (156 kB)
Installing collected packages: urllib3, idna, chardet, certifi, requests
Successfully installed certifi-2022.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.9
但是这个Requests会被安装到哪里呢
如果是使用linux的话默认会被安装到/usr/local/lib//site-packages。
Windows则是会安装到c:?<用户名>\appdata\local\programs\python\lib\site-packages。
Mac则会安装到/Library/Python//site-packages。
Mac用户和Linux用户在这个过程中还有可能遇到权限问题。
安装好了之后我们可以通过import requests来使用requests。整个软件的运行也不会有任何问题客户很满意赚钱大大的有。
于是用户又给我们了一个新的项目。在做新的项目时我们发现我们又得使用requests了只不过这次需要使用的是一个新功能只有在最新版本的requests中才有这个功能。因此我们决定对requests进行升级.
pip install --upgrade requests
一切似乎都很正常但是其实我们已经给未来埋下了隐患。
当我们运行第一个软件的时候我们发现完全运行不起来了到底怎么回事因为requests的某些API在新版本中被更改了虽然可能毕业证只是一个很小的改动直接导致了我们原来的程序无法启动了。
此时我们当然可以直接修改我们之前的应用使用最新的requests API来解决这个问题。但是这会相当的耗时间可能需要将很多东西都进行替换并且完成回归测试。从项目管理的角度来说除非是出现了一些比较严重的bug不然不应该占用新项目的时间来解决老项目的问题因为这样会影响新项目的进度。而这是很常见的一个场景更多的Python开发工作者可能不只有两个项目。如果总是把软件包都升级到最新版本对于开发者而言无异于噩梦。
virtualenv如何帮助开发者
virtualenv通过给每一个应用创建一个完全隔离的虚拟环境来解决这个问题。一个环境其实只是一个简单的文件夹包含了需要运行Python应用的所有依赖。其中也包含了Python运行程序本身一个完整的Python标准库拷贝完整的pip以及site-packages目录。当使用pip进行安装软件的时候使用的是这个virtualenv创建的pip并且会将软件包安装到这个virtualenv创建的site-packages中。
如何安装virtualenv
如果已经有了pip最简单的方式就是通过pip来安装virtualenv。pip和virtualenv也几乎是唯二的两个需要全局安装的工具了一旦有了这两个就可以通过virtualenv来创建虚拟环境并且在虚拟环境中工作。
pip install virtualenv如何创建虚拟环境
virtualenv是创建虚拟环境所需要的唯一工具而且创建过程也很简单。只需要切换到项目根目录然后通过virtualenv创建一个新的虚拟环境
cd /path/to/myproject
virtualenv venv
这里venv是虚拟环境文件夹的名字。这个文件夹会在项目文件夹中。例如如果我的项目在/sources/myproject那么venv的地址就是/sources/myproject/venv。但是其实我们可以将其放在任何文件夹中。
注意如果使用类似于git之类的版本控制记得将venv添加到.gitignore中。
如何使用venv
如果我们查看venv文件夹的话我们会看到如下一些文件夹
什么是pip和virtualenv?Python新手必读
venv
这里主要的是Scripts文件夹里面放置了完整的python运行命令以及pip。我们可以尝试使用Scripts中的pip进行安装requests。
什么是pip和virtualenv?Python新手必读
使用venv中的pip安装requests
一切正常而且requests被安装到了venv/Lib/site-packages中了。
我们也可以使用venv/Scripts/Python命令一切使用正常。
但是。。用起来真的好麻烦
别急virtualenv的开发者也想到了这点因此他们提供了一个工具activate来减轻virtualenv使用者的负担这样就不需要每次都输入完整的路径了。
在linux下
$ source venv/bin/activate
在Windows中
venv\Scripts\activate
使用了activate之后我们再使用pip进行安装默认就安装到venv中了。当然了这个activate只在当前的terminal中起作用如果新开一个terminal的话我们需要重新运行一次activate。如果希望在当前的terminal中切换到其他venv中我们还可以调用deactivate来取消当前虚拟环境的使用。
Requirements.txt
pip和virtualenv就是一对好伙伴特别是使用requirements.txt的时候。我们在本地创建好了我们的项目以及一系列依赖之后我们会把这些代码包括依赖推送到代码仓库或作为备份或与别人分享。很有包的体积都比较大而且包并没有什么特殊性因为我们肯定不希望我们直接将项目依赖的包推到代码仓库上。这时候我们就可以使用requirements.txt了。通过pip的freeze命令可以格式化的输出已经安装的软件包通过重定向可以将输出直接写入requirements.txt文件。
什么是pip和virtualenv?Python新手必读
生成requirements.txt文件
有了requirements.txt文件之后自然也可以通过requirements.txt文件来继续安装。使用的就是pip install -r 的命令。下面截图显示的例子就是在一个新的虚拟环境venv2中安装requirements.txt中的软件包。
什么是pip和virtualenv?Python新手必读
安装requirements.txt定义的软件包
来个小结
pip能够帮助我们安装软件包pip是比easy_install优秀的一个工具建议使用pip
virtualenv能够帮助我们创建一个隔离的运行环境
为了不用输入完整路径使用activate来激活虚拟环境
使用requirements.txt来和他人共享项目依赖信息