Skip to content

Python 虚拟环境

什么是 python 环境,我们来看一下以下常见:

  • 有两个项目 A 和 B,如果 A 和 B 都要用到某一模块,但版本不相同怎么办?
  • 在使用 pip 安装包时,会发现在安装的时候会安装其它的依赖包,但当我们用 pip 移除一个包时,却只移除了指定的包

为了解决上面的问题,python 使用了虚拟环境这个概念,可以认为是 python 环境的多个副本,只是在不同的副本中安装了不同的包。虚拟环境与全局环境不一样:虚拟环境中一般不包含标准库;不包含 python 解释器运行时所需的依赖文件;

常用的管理虚拟环境有一下几个

  • Virtualenv(支持 python2 和 python3,不好用)
  • venv (官方python3.3之后新增,方便,有时候有问题,推荐)
  • pipenv(之前有大坑,现在不清楚,不推荐)
  • conda(没用过,不推荐)
  • poetry(好用,就是有点复杂,推荐)

venv

Python 从3.3 版本开始,自带了一个虚拟环境模块 venv ,关于该模块的详细介绍,可参考 PEP-405 和。

1. 命令概览

查看venv帮助信息:

python -m venv -h

2. 创建虚拟环境

python -m venv venv_demo

如果是 windows 下生成的目录结构如下

C:\Users\xxp\Desktop\venv_demo>tree /f 
│  pyvenv.cfg

├─Include
├─Lib
│  └─site-packages
└─Scripts
        activate
        activate.bat
        Activate.ps1
        deactivate.bat
        pip.exe
        pip3.10.exe
        pip3.exe
        python.exe
        pythonw.exe

linux 下是这样的

.
├── bin
│     ├── activate
│     ├── activate.csh
│     ├── activate.fish
│     ├── Activate.ps1
│     ├── pip
│     ├── pip3
│     ├── pip3.10
│     ├── python -> python3
│     ├── python3 -> /usr/bin/python3
│     └── python3.10 -> python3
├── include
├── lib
│     └── python3.10
│         └── site-packages
├── lib64 -> lib
└── pyvenv.cfg

3. 虚拟环境的激活

windows 下在虚拟环境的 Scripts 目录中有两个脚本文本 activate.batdeactivate.bat ,分别用于激活虚拟环境和退出虚拟环境。

1、cmd 命令下进入虚拟环境之后会添加前缀

C:\Users\xxp\Desktop\venv_demo>Scripts\activate.bat
(venv_demo) C:\Users\xxp\Desktop\venv_demo>

2、退出虚拟环境之后会消失

(venv_demo) C:\Users\xxp\Desktop\venv_demo>Scripts\deactivate.bat
C:\Users\xxp\Desktop\venv_demo>

关于 pip 指令的用法可以查看 pip 的使用

poetry 的使用

poetry 是一个 Python 虚拟环境和依赖管理的工具,可以用来代替 venv、pipenv。poetry 和 pipenv 类似,另外还提供了打包和发布的功能。

官方文档:https://python-poetry.org/docs/

安装

pip install poetry

已有项目添加 poetry 管理

poetry 可以输入 poetry new 来创建一个项目脚手架,包括基本结构、pyproject.toml 文件。

ubuntu@VM-4-12-ubuntu:~$ python3 -m poetry new poetry_demo
Created package poetry_demo in poetry_demo
ubuntu@VM-4-12-ubuntu:~$ cd poetry_demo/
ubuntu@VM-4-12-ubuntu:~/poetry_demo$ tree
.
├── poetry_demo
│     └── __init__.py
├── pyproject.toml
├── README.md
└── tests
    └── __init__.py

2 directories, 4 files

如果不想使用默认的模板,推荐在已有项目添加 poetry 管理。 在已有的项目使用 poetry ,只需要执行 poetry init 命令来创建一个 pyproject.toml 文件,可看到有很多提示输入,不确定的内容就先按下 Enter 使用默认值,后续可以再修改 pyproject.toml 文件。 指定依赖的环节也可以跳过,后续再安装会更加高效。

ubuntu@VM-4-12-ubuntu:~$ mkdir poetry_demo2
ubuntu@VM-4-12-ubuntu:~$ cd poetry_demo2
ubuntu@VM-4-12-ubuntu:~/poetry_demo2$ python3 -m poetry init

This command will guide you through creating your pyproject.toml config.

Package name [poetry_demo2]:
Version [0.1.0]:
Description []:
Author [None, n to skip]:  zhengxinonly
License []:
Compatible Python versions [^3.10]:

Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
  - A single name (requests): this will search for matches on PyPI
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Package to add or search for (leave blank to skip):

Would you like to define your development dependencies interactively? (yes/no) [yes]
Package to add or search for (leave blank to skip):

Generated file

[tool.poetry]
name = "poetry-demo2"
version = "0.1.0"
description = ""
authors = ["zhengxinonly"]
readme = "README.md"
packages = [{include = "poetry_demo2"}]

[tool.poetry.dependencies]
python = "^3.10"


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


Do you confirm generation? (yes/no) [yes]

这样就会在当前目录下生成一个 pyproject.toml 文件,里面就有刚刚设置好的内容。

创建虚拟环境

1、利用 virtualenvs.create=true 自动创建 当参数 virtualenvs.create=true 时,执行 poetry install 或 poetry add 时会检测当前项目是否有虚拟环境,没有就自动创建。

$ poetry add requests
Creating virtualenv py-demo-dWth49HK-py3.10 in C:\Users\pc\AppData\Local\pypoetry\Cache\virtualenvs
Using version ^2.28.1 for requests

Updating dependencies
Resolving dependencies... Downloading https://files.pythonhosted.org/packages/1d/38/fa96a426e0c0e68aabc68e896584b83ad1eeResolving dependencies... (6.3s)

Writing lock file

Package operations: 5 installs, 0 updates, 0 removals

  • Installing certifi (2022.9.24)
  • Installing charset-normalizer (2.1.1)
  • Installing idna (3.4)
  • Installing urllib3 (1.26.12)
  • Installing requests (2.28.1)

2、利用 poetry env use 创建

这个命令,可以指定创建虚拟环境时使用的 Python 解释器版本。

$ poetry env use python
Creating virtualenv py-demo-dWth49HK-py3.10 in C:\Users\pc\AppData\Local\pypoetry\Cache\virtualenvs
Using virtualenv: C:\Users\pc\AppData\Local\pypoetry\Cache\virtualenvs\py-demo-dWth49HK-py3.10

从提示信息,可以看到使用了那个解释器创建虚拟环境. 使用这个命令后,会在虚拟环境路径下创建一个 envs.toml 文件,用来存储哪些虚拟环境指定了 Python 解释器的版本。

[py-demo-dWth49HK]
minor = "3.10"
patch = "3.10.8"

激活虚拟环境

执行 poetry 的命令并不需要激活虚拟环境,因为 poetry 会自动检测当前虚拟环境,如果想在当前目录对应的虚拟环境中执行命令,可以使用以下命令:

poetry run <你的命令>
# 例如: poetry run python flask.py

如果想显示的激活虚拟环境,使用如下命令:

poetry shell

安装依赖

  • poetry add flask :安装最新稳定版本的
  • flask poetry add pytest --dev : 指定为开发依赖,会写到 pyproject.toml 中的 [tool.poetry.dev-dependencies]区域
  • poetry add flask=2.22.0 : 指定具体的版本
  • poetry install : 安装 pyproject.toml 文件中的全部依赖
  • poetry install --no-dev : 只安装非 development 环境的依赖,一般部署时使用

附录

更多内容推荐阅读: 使用 Python Poetry 进行依赖项管理(翻译)