Python虚拟环境教程,使用Virtualenv和Poetry
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
一个简短的指导教程,展示如何使用虚拟环境以及为什么虚拟环境很重要,并附有 virtualenv 和诗歌的插图示例。
这篇博文是关于什么的
这篇博文主要面向那些没有使用过 Python 虚拟环境的人。你会发现,这并非一份完整的 Python 虚拟环境参考指南,而是一个关于以下方面的简短教程:
- 什么是Python虚拟环境?
- 何必用它呢?
- 如何使用。
...以两个流行的模块为例:virtualenv和,以及诸如通过Python 插件poetry使用的 IntelliJ IDE 、PyCharm 社区版、VSCode、Windows 系统和 Git Bash 终端等软件为例。
📌注意:如果您正在使用 JetBrains 产品,您还需要索引虚拟环境中已安装的站点包,这是 JetBrains 的核心功能:代码补全、检查、查找用法、导航、语法高亮、重构等等。
什么是虚拟环境?
能将其他事物隔离开来的事物
Python 虚拟环境本质上是一个单独的文件夹,它在自己的目录中创建了一组独立的已安装软件包和 Python 二进制文件,从而将计算机上的任何其他 Python 安装隔离开来。
防止冲突的事物
Python 虚拟环境用于防止干扰其他应用程序的行为。因此,当在同一系统上运行不同项目时,它可以防止软件包或 Python 版本冲突。
为什么要使用虚拟环境?
为了避免Python版本冲突
Python 虚拟环境允许多个 Python 版本共存。它允许你在同一系统上安装新版本 Python 后,仍然使用旧版本。
如果没有独立的虚拟环境,尝试这样做很快就会出错:
为了避免软件包版本冲突
假设你有两个项目,其中两个项目都在使用全局(系统范围)安装的serpapi库,版本为1.15。
项目 1依赖于1.05版本,项目 2依赖于1.08import版本。如果每个项目都尝试访问同一个serpapi库,会发生什么情况?
不带虚拟环境的示例
由于 Python 无法区分/site-packages目录中同一库的不同版本,因此当有两个项目需要同一库的不同版本,而全局安装的库的版本又完全不同时,就会出现问题。
虚拟环境示例
使用 Python 虚拟环境时,您可以使用同一库的不同版本,或者使用由不同虚拟环境(文件夹)分隔的不同 Python 版本。
📌注意:您可以全局安装不同版本的 site-packages 并使用它们,但如前所述,这很快就会变得一团糟,并可能破坏系统工具或其他项目。
如何使用虚拟环境?
让我们来看一些如何使用 Python 虚拟环境的例子,包括初始安装、创建和激活环境、使用模块添加依赖项virtualenv以及poetry完成后停用虚拟环境。
使用 Virtualenv 的示例过程
安装 virtualenv:
$ pip install virtualenv
在当前包/项目目录下创建环境文件夹:
$ python -m venv env
| 代码 | 解释 |
|---|---|
-m |
执行模块 venv |
env |
是模块创建的文件夹名称venv。虚拟环境的名称可能不同,例如kitty或yolo。 |
激活环境:
# On Windows
source env/Scripts/activate
(env)
# On Linux
$ source env/bin/activate
(env) $
(env)表示您处于虚拟环境中。
根据您创建的文件夹,将站点包(第三方库)添加到已激活的环境中。
添加最新版本:
(env) $ pip install google-search-results
使用等号添加特定版本==:
(env) $ pip install 'google-search-results==1.3.0'
📌注意:如果您使用的是 Windows 系统和命令行提示符,请"在指定版本时使用双引号:
pip install 'google-search-results==1.3.0'
ERROR: Invalid requirement: "'google-search-results==1.3.0'"
添加特定版本,不覆盖较低版本:
(env) $ pip install -I 'google-search-results==1.3.0'
快速了解如何安装 site-package( virtualenv) 并为特定 Python 版本创建虚拟环境:
# For Windows:
# install package for specific Python version (https://bit.ly/3pXtHng)
$ py -3.6 -m pip install virtualenv
# create venv for specific Python version (https://bit.ly/3oQ008v)
$ py -3.6 -m venv my_test_env
# For Linux:
# install package for specific Python version
$ python3.6 -m pip install virtualenv
# create venv for specific Python version
$ python3.6 -m venv my_test_env
在 JetBrains IDE 中使用并索引已添加的站点包
请参阅“激活和索引已安装的软件包”部分,其中包含使用PyCharm、IntelliJ和VSCodepoetry的示例图解过程。
除了不需要poetry通过命令行查找缓存文件夹来查找文件路径之外,其他一切都几乎相同,python.exe因为该文件夹已经位于上面env创建的项目目录中。
完成后停用虚拟环境:
(env) $ deactivate
$
诗歌运用过程示例
安装 poetry:
$ pip install poetry
poetry快速了解如何为特定 Python 版本安装 site-package( ):
# For Windows:
$ py -3.6 -m pip install poetry
# For Linux:
$ python3.6 -m pip install poetry
在当前包/项目目录poetry中创建(初始化) :
$ poetry init
该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"
简而言之,pyproject.toml是新的统一 Python 项目设置文件,其中包含构建系统要求和信息,用于pip构建包/项目,它几乎可以替代setup.py。
创建之前pyproject.toml,$ poetry init系统会交互式地要求您填写有关您的软件包/项目的字段:
| 争论 | 解释 |
|---|---|
--name |
包裹名称/包裹。 |
--description |
包裹描述。 |
--author |
软件包作者。 |
--python |
兼容的Python版本。 |
--dependency |
要引入的软件包,需指定版本。格式应为package:1.0.0(版本号)。 |
--dev-dependency |
开发要求,请参见--require |
为您的软件包/项目添加依赖项:
$ poetry add google-search-results
...
Creating virtualenv PROJECT-9SrbZw5z-py3.9 in C:\Users\USER\AppData\Local\pypoetry\Cache\virtualenvs
Using version ^2.4.0 for google-search-results
Updating dependencies
Resolving dependencies...
Writing lock file
Package operations: 1 install, 0 updates, 0 removals
• Installing google-search-results (2.26.0)
该add命令会将依赖项添加到 `<path>`pyproject.toml和 `<path> poetry.lock`,并安装它们。` Creating virtualenv<path>` 将使用指定的路径创建一个虚拟环境。环境创建只会执行一次。`<path>`Writing lock file会将依赖项写入poetry.lock文件。
poetry.lock阻止自动获取依赖项的最新版本。您可以显式编写lock命令来锁定列出的依赖项。pyproject.toml
添加特定版本:
# multiple ways
# double quotes ("foo") for Windows CMD
$ poetry add google-search-results@^2.1.0
$ poetry add 'google-search-results>=1.8.5'
$ poetry add 'google-search-results==1.8.5'
$ poetry add google-search-results@latest
如果您指定了约束条件(`--constraint`@或 `--constraint` >=),依赖项将根据指定的约束条件进行更新。否则,如果您尝试添加一个已存在的包,将会收到错误提示。
(可选)从现有项目/包依赖项安装。
如果您使用的是已创建的包含 .htm 文件poetry.lock或.htmpyproject.toml文件的项目,则可以将这些依赖项安装到虚拟环境中:
$ poetry install
该install命令读取 pyproject.toml文件poetry.lock并安装所有列出的依赖项。
- 诗歌使用了以下列出的确切版本
poetry.lock。
- Poetry 将解析文件中的所有依赖项
pyproject.toml,并下载其文件的最新版本。
(可选)要不安装开发依赖项,请使用--no-dev以下参数:
$ poetry install --no-dev
在 IDE 中使用添加的站点包
如果使用,请先poetry通过config --list命令查找已初始化环境的位置。virtualenvs.path在输出中查找:
$ poetry config --list
cache-dir = "C:\\Users\\USER\\AppData\\Local\\pypoetry\\Cache"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = null
👉virtualenvs.path = "{cache-dir}\\virtualenvs" 👉👉👉# C:\Users\USER\AppData\Local\pypoetry\Cache\virtualenvs
还需要完成几个步骤:
-
进入
virtualenvs.path文件夹并打开创建的环境文件夹(在我的例子中是PROJECT-9SrbZw5z-py3.9:)。 -
转到
Scripts(Windows)或bin(Linux)文件夹,复制完整路径,并python.exe在路径末尾添加:
C:\Users\USER\AppData\Local\pypoetry\Cache\virtualenvs\PROJECT-9SrbZw5z-py3.9\Scripts\python.exe
virtualenvs.path需要找到python.exe已创建的虚拟环境内部的路径,以便 JetBrains 或 VSCode 可以索引已安装的站点包。
如果使用virtualenv,请转到env\Scripts\python.exe项目中的文件夹,复制python.exe文件的完整路径,并将其作为系统解释器输入到 IDE 中。
激活并索引已安装的软件包
目前,如果在 IDE 中运行脚本,它会查找全局安装的包(serpapi例如),并会抛出错误,因为全局范围内没有安装该库(如果已安装,则不会抛出错误):
Traceback (most recent call last):
File "C:\Users\USER\PyCharmProjects\PROJECT\environment.py", line 1, in <module>
from serpapi import GoogleSearch
ModuleNotFoundError: No module named 'serpapi'
VSCode 版本
要在 VSCode 中解决此问题,我们需要选择一个虚拟环境 Python 解释器并将其设置为系统解释器。
打开命令面板CTRL+SHIFT+P并输入:Python: 系统解释器(应已安装Python 扩展)。
无论对于virtualenv和poetry,VSCode 都应该自动python.exe从虚拟环境中检测到正确的文件。
如果您在虚拟环境中找不到合适的路径python.exe,则需要找到并进入该路径。
现在,您可以通过命令行或使用VSCode Code Runner 扩展程序从虚拟环境运行您的 Python 脚本。
PyCharm 版本
python.exe要在 PyCharm 中解决这个问题,我们需要添加文件夹路径virtualenv并将其设置为PyCharm 系统解释器,这样就可以索引虚拟环境中的所有 site-packages:
IntelliJ IDEA 版本
python.exe要在 IntelliJ IDEA 中解决这个问题,我们需要添加文件夹路径virtualenv,并将其设置为PyCharm 系统解释器,同时进行一些额外的调整,以便索引虚拟环境中的所有 site-packages:
完成后停用虚拟环境
要停用虚拟环境以便在 PyCharm、IntelliJ IDEA 和 VSCode 中使用系统 Python,您需要将 Python 系统解释器设置回默认值,不带virtualenv前缀,例如:“ Python 3.9 virtualenv.. ” ==> “ Python 3.9 ”,这是上面所示过程的逆过程。
使用 Gitpod
Gitpod几乎完美地解决了这个问题。你无需安装 Python,无需创建环境,只需点击一下按钮即可完成所有操作。
当然,针对特定情况,你需要安装特定的软件。另外,如果你真的想的话,也可以直接在浏览器中编写代码。
例如,使用Gitpod Chrome 扩展程序,您可以打开特定文件:
- 问题
- 公关
- 分支
- 文件
- 还有一件事我可能会忘记。
例如,如果您提交了一个 issue,它会立即跳转到相应的分支,这非常棒。它类似于持续集成 (CI) 服务器,会持续为您的所有分支、拉取请求或其他类型准备预构建版本。您还可以设置工作流,用于执行预构建(例如安装 site-packages)、启动开发服务器或其他操作。
您可以通过Open VSX 注册表在预构建版本上安装 VSCode 扩展✨
结论
不同的项目——不同的环境
简而言之,如果您需要同时处理多个项目,那么使用虚拟环境会更好:
- 使用不同的库版本。
- 使用不同的Python版本。
全局安装会造成混乱。
为不同的项目全局安装同一库的不同版本很快就会变得一团糟,毫无秩序可言;如果需要安装不同版本的 Python,那将会变成一场彻头彻尾的混乱:
链接
致谢
非常感谢以下几位朋友对插图提出的反馈意见:
文章来源:https://dev.to/dmitryzub/python-virtual-environment-what-why-how-virtualenv-poetry-2nff

















