Python 虚拟环境方案比较

2018.01.09

最近在写一个网站后台,由于涉及到阿里云的 SDK ,而阿里云在自己的源(https://mirrors.aliyun.com)上发布的 SDK 要新,因此在设置 Python 的包管理的时候需要注意很多东西。

同时由于历史遗留问题,flask 使用 pipreqs 生成的 requirements.txt 实际上有很多包都不全。在涉及包相对较少的时候还可以使用自定义的 additional reqs 来设置,但是这样子不是很优雅。因此仔细比较了一下常见的 python 虚拟环境方案。

1.Pip

首先要讲讲 pip。Pip 是 python 的包管理工具。 Pip 被用来安装各种包,比如 tensorflow、numpy、pandas 和 jupyter,同时还会自动初一的依赖。

许许多多的 Python 资源都通过 pip 包的形式来传输。有时你会在某个包含 Python 脚本的目录下看到一个 requirement.txt 文件。通常,那个文件描述了当前项目所需的所有 pip 包,通过下面的命令即可将它们都安装到当前目录。

作为整个 pip 包生态的一份子,各种各样的版本号、以来信息充斥其中。有时我会针对不同项目使用不同版本的库(pip 包),所以我需要有一种能够针对独立环境配置一组包依赖关系的方式。

2.pipenv

最近非常火的 pipenv,它能通过自己的包管理实现版本跟踪,拥有自己的配置文件,每个包都有自己的哈希。

实际使用的时候发现 pipenv 十分慢,尤其是在gitlab ci 构建容器的过程中,原来 1 min可以完成的构建现在可能需要 5 min 左右,而且官方文档很稀少,很多实现需要看源码。

如果不需要频繁测试或者部署的应用 pipenv 应该是一个不错的选择,以下是 pipenv 的一些主要用法。

pipenv 会生成两个文件:PipfilePipfile.lock

Pipfile

Pipfile.lock

启动 python3 的虚拟环境

初始化(部署)python 包管理(生成相关配置文件)

通过 Pipfile 部署环境到系统(根据自动生成的相关配置文件)

安装 requests 库

删除 requests 库

进入虚拟环境的 shell

直接在虚拟环境执行 shell

列出包依赖关系

生成锁文件

3.Virtualenv

Virtualenv 支持你创建可命名的“虚拟开发环境”,在其中你就能按照单独的习惯安装 pip 包了。 如果你想要针对每个环境独立控制对各类 pip 包的管理,那么这就是一款绝佳的工具比如,你可以为 Web 开发创建独立的环境,定义所需的依赖库,然后为数据相关的开发研究建立截然不同的环境。 这样一来,你再也不用顾虑各种毫无关系的依赖包在开发环境中存在,也可以创建具有专门用途的开发环境。

初始化

source进入该环境

在虚拟环境安装包

退出当前的venv环境,使用deactivate命令:

4.pyenv

Python 多版本共存的方案,类似 nvm 实际上并不能作为一个很好的虚拟环境方案,简单写一下相关的操作。

查看可安装 Python 版本

安装相应版本

全局 Python 版本

评论