因为觉得有参考价值,一直打开许多页面没有关闭,浏览器的 tab 都差不多上百了,决心把一些有意义的内容通过翻译、摘录和重编的形式把核心内容快速统一到博客上来,方便后续检索,也好关掉一些浏览器窗口。

本文是Python Virtual Environments tutorial using Virtualenv and Poetry的翻译、摘录和重编,原作者Dmitriy Zub,我去掉了IDE的部分,加入了一些其它内容,让它更加顺畅内聚。

简介

首先这是篇向大家介绍虚拟环境和virtualenvpoetry小教程,专注在这三个方面:

  1. 什么是Python虚拟环境
  2. 为什么要用它
  3. 怎么用它

什么是虚拟环境

简而言之,就是一个用来隔离东西的东西。可以简单把它理解为把一些安装的包独立放在某一个文件夹的机制,Python可以在某一个固有的独立文件夹里查找和加载安装的包,这样就实现了一台电脑里多个隔离的Python。

然后它是可以防止冲突,比如不同的项目可能有相同的名字的包,如果安装在一起,必然产生冲突。

python可以做vr吗 vr python_poetry

为什么要用虚拟环境

首先是避免Python版本冲突,有时候你安装完新版本的Python后还需要使用旧版本的Python,也有可能需要使用多个版本的Python,这可能使你不得不把它们分别安装在不同的目录,然后在使用的时候,小心翼翼地选择你想要的Python版本,就像下图这样。

python可以做vr吗 vr python_python可以做vr吗_02


虚拟环境可以让你在同一个系统中实现多个版本共享,使用起来还是像只有一个Python版本一样是不是方便了许多。其次就是避免包版本的冲突,比如你有两个项目,一个依赖Django 2.2,一个依赖Django 4.0,如果没有虚拟环境,只能存在一个版本,它们import的时候必然有一个启动不了。

python可以做vr吗 vr python_virtualenv_03


有虚拟环境的话,就很简单,各自的环境是独立的,你用的你的2.2,我用我的4.0,各自安好。

python可以做vr吗 vr python_poetry_04

如何使用虚拟环境

下面举例说明如何使用虚拟环境,

python可以做vr吗 vr python_python可以做vr吗_05


首先是安装virtualenv

$ pip install virtualenv

然后在项目目录 package/project 创建环境文件夹,

$ virtualenv env

这里的env就是创建的虚拟环境了,里面会独立安装这个虚拟环境的程序包。接下来激活它,

$ source env/bin/activate
(env) $

你可以看到系统的提示符前缀变成了(env),表示你正处于这个虚拟环境之中。这时候安装程序包就会安装到env目录中去,

(env) $ pip install google-search-results

要退出当前虚拟目录很简单,只要执行,

(env) $ deactivate
$

可以看到系统的提示符前缀恢复了。

使用 Poetry

首先是安装它,

$ pip install poetry

安装以后,在package/project目录中执行,

$ poetry init

它会交互式地问你一些项目名、描述、作者、兼容的版本和依赖的程序包之类的问题,最后会在目录下生成一个pyproject.toml文件,它就是用来管理项目和依赖的载体,看起来大概如下:

# pyproject.toml file

[tool.poetry]
name = "virtual environments"
version = "0.1.0"
description = ""
authors = ["Dimitry Zub <dimitryzub@gmail.com>"]

[tool.poetry.dependencies]
python = "^3.9"
google-search-results = "^2.4.0"
# other site-packages will appear here..

[tool.poetry.dev-dependencies]
# development dependencies will appear here..

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

简单来说,它就是新的统一的Python项目配置文件,它包含构建系统的需求和信息,pip可以用它来构建系统,它几乎就是setup.py替代器。
package/project中加入新的依赖,可以使用poetry add命令,

$ poetry add google-search-results

这时候poetry会为项目创建一个虚拟环境,并安装指定包,把包名、版本等信息写入pyproject.tomlpoetry.lock,其中后者可以锁定依赖包的版本。

如果项目已经创建了poetry.lockpyproject.toml,那可以用下面的命令来安装依赖包:

$ poetry install

install指令会读取pyproject.tomlpoetry.lock,并安装里面列出的依赖,对poetry.lock的处理方式是这样的:如果有这个文件,就安装里面指定的版本的包,如果没有,那就从pyproject.toml中计算依赖,并安装满足条件的最新版本的包。额外的,如果不想安装开发版本依赖,需要加上--no-dev参数:

$ poetry install --no-dev

结论

不同项目,不同环境。简单来说,就是对不同的项目要做好隔离,实现各项目使用不同的库版本,甚至不同的Python版本。

全局安装必然引发混乱,想像一下如何在全局安装多个不同版本的包,又如何让多个版本的Python共存,就让人头大了,千万不要这么干。