要不我们还是用回 virtualenv/venv 和 pip 吧

这篇文章没什么新东西,只是介绍古老又靠谱的 Python 虚拟环境和依赖管理方式:virtualenv/venv+pip。一来方便被我在《Flask 入门教程》和《Flask Web 开发实战》带入 Pipenv 坑的初学者了解基础工具的用法,二来方便其他 Python 初学者参考,自己顺便做个总结。如果你想了解更多详细内容,Python 官方教程这一章写的更好,可以替代这篇文章。

既然大部分试图简化 Python 虚拟环境和依赖管理工作流程的新工具都不够稳定,继续使用 virtualenv/venv 和 pip 这样的底层工具也是一个不错的选择,而且大多数人也是这么做的。它们虽然用起来有一点麻烦,但至少更可靠。

基本概念

下面是一些基本概念:

  • PyPA:指 Python Packaging Authority,一个维护 Python 打包相关项目的小组,相关项目具体见 https://github.com/pypa
  • pip:Python 包安装器 。
  • virtualenv:Python 虚拟环境管理工具。
  • venv:Python 标准库内置的虚拟环境管理工具,Python 3.3 加入,Python 3.5 开始作为管理虚拟环境的推荐工具,用法类似 virtualenv。如果你使用 Python 3,推荐使用 venv 来替代 virtualenv。

使用 virtualenv/venv 管理虚拟环境

venv 模块

如果你使用 Python 3(具体说是 Python 3.3 及以上版本),推荐使用标准库内置的 venv 模块替代 virtualenv,两者的使用方式基本相同,唯一不同的是创建虚拟环境的方式。

如果你使用 Python 2,那就只能选择 virtualenv,你需要额外安装它。我先假设你已经安装了 pip,因为在 Python 2 >=2.7.9 或 Python 3 >=3.4 这些版本的 Python 会一并安装 pip,其他版本可以参考文档的安装部分。在 Windows 下使用下面的命令安装 virtualenv:

$ pip install virtualenv

其他操作系统可以使用下面的命令安装:

$ sudo pip install virtualenv

尽管不推荐使用 sudo pip 的方式安装 Python 包,但这仍然是最简单和统一的方式。更安全的方式是使用系统包管理器来安装,或是使用 pip –user 方式安装。

创建虚拟环境

假设我们的项目名叫 snow,创建对应的文件夹然后切换到根目录:

$ mkdir snow
$ cd snow

如果使用 venv,那么使用下面的命令创建虚拟环境,其中 snow-venv 是虚拟环境的名字,也作为创建的虚拟环境文件夹名称,你可以自由修改(通常会使用 venv 或 env 作为虚拟环境名):

$ python -m venv snow-venv

如果使用 virtualenv,则使用下面的命令:

$ virtualenv snow-venv

这会在当前目录创建名为 snow-venv 的虚拟环境文件夹,你需要把这个文件夹名称加入 .gitignore 文件以便让 Git 忽略。

激活虚拟环境

通过执行对应的激活脚本来激活虚拟环境,不同操作系统的激活命令(激活脚本及路径)有一点不同。Windows(CMD.exe)使用下面的命令激活:

$ snow-venv\scripts\activate

Linux 和 macOS(bash/zsh)使用下面的命令:

$ source snow-venv/bin/activate

或:

$ . snow-venv/bin/activate

类似的,其他终端程序可以执行对应的激活脚本来激活虚拟环境。

激活虚拟环境以后,命令行提示符前会显示当前虚拟环境的名字:

(snow-venv) $

使用 deactivate 命令可以退出虚拟环境。

使用 pip 管理依赖

简单列一下基本用法,虽然大部分人都很熟悉了……以 Flask 为例,首先是安装依赖:

(snow-venv) $ pip install flask

更新依赖:

(snow-venv) $ pip install --upgrade flask

或是:

(snow-venv) $ pip install -U flask

卸载依赖:

(snow-venv) $ pip uninstall flask

除此之外,还有 pip show flask 命令可以查看某个依赖的详细信息,pip list 列出所有依赖。

下面的命令可以手动生成依赖列表:

(snow-venv) $ pip freeze > requirements.txt

如果你需要手动开发依赖和生产依赖,可以手动把开发相关的依赖放到单独的文件,比如 requirements-dev.txt。

当你需要在新的机器创建程序运行环境时,(创建虚拟环境后)只需要使用下面的命令从依赖文件安装所有依赖:

(snow-venv) $ pip install -r requirements.txt

如果安装包的时候速度太慢,可以考虑设置 PyPI 国内镜像,具体参考这篇文章

从其他工具迁移回来

如果你想从 Pipenv 迁移回来,方法很简单,只需要生成一个 requirements.txt 文件即可。使用下面的命令生成一般依赖列表:

$ pipenv lock -r

使用下面的命令输出开发依赖列表:

$ pipenv lock -r --dev

然后手动把两个命令的输出保存为 requirements.txt 和 requirements-dev.txt。

从 Poetry、Conda 等其他工具迁移回来可以使用 pipreqs 来生成 requirements.txt,它会基于项目代码的导入语句来生成依赖列表。

在下一篇文章,我会介绍一些辅助工具来搭配 virtualenv/venv+pip 使用,让虚拟环境和依赖管理更方便,比如 virtualenvwrapper、pip-tools 等。

(4)

要不我们还是用回 virtualenv/venv 和 pip 吧》上有9条评论

  1. 头像Wh_Xcjm

    请问一下,pipenv是否可以通过修改配置文件的方式默认选择某一python版本呢,在网上没查到相关信息

    回复
    1. 头像李辉 文章作者

      如果你是指创建虚拟环境使用的 Python 版本,那么可以通过系统环境变量 PIPENV_DEFAULT_PYTHON_VERSION 来指定(docs)。如果是指项目依赖所需要的 Python 版本,可以参考这里。也就是在 Pipfile 里添加下面的内容:

      [requires]
      python_version = “3.6”

      回复
  2. 头像小风

    作为一个不理解背后原理,就理解不了的人,想请问一下博主,这个python虚拟环境到底是什么?其工作原理是什么?为什么大家都推荐使用虚拟环境?和vmware workstation这样的虚拟机有什么区别与联系?

    回复
    1. 头像李辉 文章作者

      简单回答下,供参考。

      • 是什么:一个独立的 Python 解释器环境;
      • 原理是什么:创建一个单独的 Python 解释器,链接到当前项目,安装依赖时安装到对应的解释器环境;
      • 为什么推荐:避免依赖冲突,不用所有依赖都安装到一个全局的 Python 解释器环境;
      • 和虚拟机的联系:都是用来隔离环境;
      • 和虚拟机的区别:虚拟环境更方便和轻量,在 Python 解释器层面进行依赖隔离,而不是操作系统层面。
      回复
      1. 头像chen

        我一直是这么理解的,表述不专业,只是帮助有一个形象了解:
        想象你自己想做一份好吃的拌面,并且你富有创意,想尝试不同的做法,撒不同的调料试试。
        现在两种拌法:(调料A +B +C)和(调料A +E +F)
        如果你只有一个碗拌面,那你就会遇到一个问题:不同的调料拌在一起这样会串味
        于是为了不串味,你买了多个碗,不同的碗拌不同的调理,相互之间不会串味影响口感。

        虚拟环境就是这个碗,安装的包就是调料

        回复

撰写评论

电子邮件地址不会被公开,必填项已用 * 标出。