本文测试环境

  • Windows 7(SP1) 64bits
  • Pythn 3.8.4
  • Pycharm 2020.1

为什么要使用虚拟环境

对这个问题,廖雪峰老师的描述是这样的:
“在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4。所有第三方的包都会被pip安装到Python3的site-packages目录下。

如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?

这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境”

除了上面廖雪峰老师描述的这种自己在不同版本Python环境下开发项目情况外,在开发过程中,我们常常会在例如github这种源码网站下载、试用并定制各种Python半成品,此时原作品往往存在与自己机器的安装包差距,因此,当在自己环境下调试通过原项目时也离不开虚拟环境的使用——你总不会一上来就使用自己的环境工具修改下载的半成品工程,对不对?

关于pip

pip肯定是Python新手必需学习使用的工具之一,它是python下的包管理工具,主要用于从pypi下载所需的python包,但是pip不会自动处理包之间的依赖关系。

virtualenv

virtualenv是一个虚拟环境管理工具,使用virtualenv可以创建一个完全隔离的环境,但virtualenv只能创建基于本机已存在的python版本的虚拟环境;使用virtualenv创建完成环境以后,可以使用pip安装python包,也可以使用conda安装python包。

virtualenv和pip配合使用,PyCharm内置提供virtualenv支持。

关于conda

conda结合了pip和virtualenv两者的功能,使用conda可以创建任意python版本的虚拟隔离环境,而且conda还是一个包管理工具,不但可以安装python包,而且可以安装其他语言的包,更重要的是conda具有完美的包依赖关系处理能力,可以轻松的安装所需的包而不用过分的去手动处理各种包之间的依赖关系;在使用conda安装包时,可以修改安装源为https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/

https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

conda和anaconda

conda是一个通用包管理器,anaconda是python发行版,conda是用anaconda打包的;安装anaconda后会有很多预置的python包,其中也包括conda工具,可以安装miniconda以获得一个纯净的环境,然后使用conda安装所需的包。

pipenv简介

pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile、pip、clickrequests和virtualenvPipfile是社区拟定的依赖管理文件,用于替代过于简陋的 requirements.txt 文件。

你可以把它看做是pip和virtualenv的组合体,而它基于的Pipfile则用来替代旧的依赖记录方式(requirements.txt)。

如何使用Pipenv

即使你已经安装了PyCharm(注意我目前版本为2020.1)也要求先安装pipenv,命令如下:

pip install pipenv

使用Pipenv时,几乎什么都不必做,Pipenv会自动帮你管理依赖。Pipenv会在你创建虚拟环境时自动创建Pipfile和Pipfile.lock文件(如果不存在),并且会在你使用pipenv install和pipenv uninstall命令安装和卸载包时自动更新Pipfile和Pipfile.lock。

Pipfile用来记录项目依赖包列表,而Pipfile.lock记录了固定版本的详细依赖包列表。

Pipenv优势

(1)pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷。

(2)过去用virtualenv管理requirements.txt文件可能会有问题,Pipenv使用Pipfile和Pipfile.lock,后者存放将包的依赖关系,查看依赖关系是十分方便。

(3)各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。。

(4)通过加载.env文件简化开发工作流程。

(5)支持Python2 和 Python3,在各个平台的命令都是一样的。

创建pipenv:
pipenv

启动pipenv:

pipenv shell(为存在虚拟环境可自动创建)

退出pipenv:
exit

查找所有安装包:
pip list

环境内包的依赖展示:



```pipenv graph

查找虚拟环境的路径:
`pipenv --venv`

卸载安装包:
`pipenv uninstall`

【建议】在使用pipenv之前,必须彻底的忘记pip这个东西。

新建一个准备当环境的文件夹pipenvtest,并cd进入该文件夹:
pipenv --three 会使用当前系统的Python3创建环境

pipenv --python 3.6 指定某一Python版本创建环境

pipenv shell 激活虚拟环境

pipenv --where 显示目录信息
/home/jiahuan/pipenvtest

pipenv --venv 显示虚拟环境信息
/home/jiahuan/.local/share/virtualenvs/pipenvtest-9KKRH3OW

pipenv --py 显示Python解释器信息
/home/jiahuan/.local/share/virtualenvs/pipenvtest-9KKRH3OW/bin/python

pipenv install requests 安装相关模块并加入到Pipfile

pipenv install django==1.11 安装固定版本模块并加入到Pipfile

pipenv graph 查看目前安装的库及其依赖

## 在部署环境安装依赖
过去,当我们需要在一个新的环境,比如部署上线环境安装所有依赖时,我们需要重复上面的多条命令:

$ virtualenv venv  # 创建虚拟环境
$ . venv/bin/activate  # 激活虚拟环境
(venv)$ pip install -r requirements.txt  # 安装requirement.txt中记录的依赖

现在,使用Pipenv则只需要执行pipenv install,它会自动安装Pipfile中记录的依赖:

> $ pipenv install
## 区分开发依赖
以前,使用requirements.txt时,我们通过会单独创建一个requirements-dev.txt文件来手动加入开发依赖。比如项目开发时才会用到pytest,那么你需要手动创建这个文件,然后写入requirements.txt:

> pytest==1.2.3

在新的开发环境安装依赖时,你需要安装这个文件中的依赖:

> (venv)$ pip install -r requirements-dev.txt

现在:
使用Pipenv时,你只需要在安装pytest时添加一个–dev选项,它会自动被分类为开发依赖(写入Pipfile的dev-packages一节中):

> $ pipenv install pytest --dev

在新的开发环境安装依赖时,也只需要在pipenv install命令后添加–dev选项即可一并安装开发依赖:

`$ pipenv install --dev`

# 未完待续......
# 主要参考资料
* https://alexgoke.github.io/2019/07/31/Pipenv%E5%AF%B9%E6%AF%94virtualenv/
* https://www.cnblogs.com/zhaoweihang/p/10794694.html
* https://www.liaoxuefeng.com/wiki/1016959663602400/1019273143120480

* pycharm实现在虚拟环境中引入别人的项目,https://www.jb51.net/article/182237.htm