发布于 2026-01-06 0 阅读
0

Python 虚拟环境教程,使用 Virtualenv 和 Poetry DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

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 版本冲突。

venv_03 是什么?

为什么要使用虚拟环境?

为了避免Python版本冲突

Python 虚拟环境允许多个 Python 版本共存。它允许你在同一系统上安装新版本 Python 后,仍然使用旧版本。

如果没有独立的虚拟环境,尝试这样做很快就会出错:

插图来自 xkcd
Python环境 - xkcd.com

为了避免软件包版本冲突

假设你有两个项目,其中两个项目都在使用全局(系统范围)安装的serpapi库,版本为1.15

项目 1依赖于1.05版本,项目 2依赖于1.08import版本。如果每个项目都尝试访问同一个serpapi库,会发生什么情况?

不带虚拟环境的示例

由于 Python 无法区分/site-packages目录中同一库的不同版本,因此当有两个项目需要同一库的不同版本,而全局安装的库的版本又完全不同时,就会出现问题。

为什么要使用 venv_1_04

虚拟环境示例

使用 Python 虚拟环境时,您可以使用同一库的不同版本,或者使用由不同虚拟环境(文件夹)分隔的不同 Python 版本。

为什么要使用 venv_2_04

📌注意:您可以全局安装不同版本的 site-packages 并使用它们,但如前所述,这很快就会变得一团糟,并可能破坏系统工具或其他项目。

如何使用虚拟环境?

让我们来看一些如何使用 Python 虚拟环境的例子,包括初始安装、创建和激活环境、使用模块添加依赖项virtualenv以及poetry完成后停用虚拟环境。

如何使用 venv_1_07

使用 Virtualenv 的示例过程

安装 virtualenv

$ pip install virtualenv
Enter fullscreen mode Exit fullscreen mode

在当前包/项目目录下创建环境文件夹:

$ python -m venv env
Enter fullscreen mode Exit fullscreen mode
代码 解释
-m 执行模块 venv
env 是模块创建的文件夹名称venv。虚拟环境的名称可能不同,例如kittyyolo

激活环境:

# On Windows
source env/Scripts/activate

(env)
Enter fullscreen mode Exit fullscreen mode
# On Linux
$ source env/bin/activate

(env) $ 
Enter fullscreen mode Exit fullscreen mode
  • (env)表示您处于虚拟环境中。

根据您创建的文件夹,将站点包(第三方库)添加到已激活的环境中。

添加最新版本:

(env) $ pip install google-search-results
Enter fullscreen mode Exit fullscreen mode

使用等号添加特定版本==

(env) $ pip install 'google-search-results==1.3.0'
Enter fullscreen mode Exit fullscreen mode

📌注意:如果您使用的是 Windows 系统和命令行提示符,请"在指定版本时使用双引号:

pip install 'google-search-results==1.3.0'
ERROR: Invalid requirement: "'google-search-results==1.3.0'"
Enter fullscreen mode Exit fullscreen mode

添加特定版本,不覆盖较低版本:

(env) $ pip install -I 'google-search-results==1.3.0'
Enter fullscreen mode Exit fullscreen mode

快速了解如何安装 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
Enter fullscreen mode Exit fullscreen mode
# 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
Enter fullscreen mode Exit fullscreen mode

在 JetBrains IDE 中使用并索引已添加的站点包

请参阅“激活和索引已安装的软件包”部分,其中包含使用PyCharmIntelliJVSCodepoetry的示例图解过程

除了不需要poetry通过命令行查找缓存文件夹来查找文件路径之外,其他一切都几乎相同,python.exe因为该文件夹已经位于上面env创建的项目目录中

完成后停用虚拟环境:

(env) $ deactivate
$ 
Enter fullscreen mode Exit fullscreen mode

诗歌运用过程示例

安装 poetry

$ pip install poetry
Enter fullscreen mode Exit fullscreen mode

poetry快速了解如何为特定 Python 版本安装 site-package( ):

# For Windows:
$ py -3.6 -m pip install poetry

# For Linux:
$ python3.6 -m pip install poetry
Enter fullscreen mode Exit fullscreen mode

在当前包/项目目录poetry创建(初始化) :

$ poetry init
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

那到底是什么pyproject.toml

简而言之,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
Enter fullscreen mode Exit fullscreen mode
...
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)
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

如果您指定了约束条件(`--constraint`@或 `--constraint` >=),依赖项将根据指定的约束条件进行更新。否则,如果您尝试添加一个已存在的包,将会收到错误提示。

可选从现有项目/包依赖项安装

如果您使用的是已创建的包含 .htm 文件poetry.lock或.htmpyproject.toml文件的项目,则可以将这些依赖项安装到虚拟环境中:

$ poetry install
Enter fullscreen mode Exit fullscreen mode

install命令读取 pyproject.toml文件poetry.lock并安装所有列出的依赖项。

如果有poetry.lock文件

  • 诗歌使用了以下列出的确切版本poetry.lock

如果没有poetry.lock文件

  • Poetry 将解析文件中的所有依赖项pyproject.toml,并下载其文件的最新版本。

可选)要不安装开发依赖项,请使用--no-dev以下参数:

$ poetry install --no-dev
Enter fullscreen mode Exit fullscreen mode

在 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
Enter fullscreen mode Exit fullscreen mode

还需要完成几个步骤:

  • 进入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
Enter fullscreen mode Exit fullscreen mode
  • 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'
Enter fullscreen mode Exit fullscreen mode

VSCode 版本

要在 VSCode 中解决此问题,我们需要选择一个虚拟环境 Python 解释器并将其设置为系统解释器

打开命令面板CTRL+SHIFT+P并输入:Python: 系统解释器应已安装Python 扩展)。

Vscode_1

无论对于virtualenvpoetry,VSCode 都应该自动python.exe从虚拟环境中检测到正确的文件。

如果您在虚拟环境中找不到合适的路径python.exe,则需要找到并进入该路径。

Vscode_2

现在,您可以通过命令行或使用VSCode Code Runner 扩展程序从虚拟环境运行您的 Python 脚本。

PyCharm 版本

python.exe要在 PyCharm 中解决这个问题,我们需要添加文件夹路径virtualenv并将其设置为PyCharm 系统解释器,这样就可以索引虚拟环境中的所有 site-packages:

pycharm_env_1

pycharm_env_2

pycharm_env_3

pycharm_env_4

IntelliJ IDEA 版本

python.exe要在 IntelliJ IDEA 中解决这个问题,我们需要添加文件夹路径virtualenv,并将其设置为PyCharm 系统解释器,同时进行一些额外的调整,以便索引虚拟环境中的所有 site-packages:

智能环境_1

智能环境 2

智能环境 3

智能环境 4

智能环境 5

完成后停用虚拟环境

要停用虚拟环境以便在 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,那将会变成一场彻头彻尾的混乱:

图像



致谢

非常感谢以下几位朋友对插图提出的反馈意见:


关注我们的推特| YouTube

添加功能请求💫或错误报告🐞

文章来源:https://dev.to/dmitryzub/python-virtual-environment-what-why-how-virtualenv-poetry-2nff