使用虚拟环境

当您运行 pdm init 命令时,PDM 会询问您在项目中要使用的 Python 解释器,这是安装依赖项和运行任务的基础解释器。

PEP 582 相比,虚拟环境被认为更成熟,在 Python 生态系统以及 IDE 中也有更好的支持。因此,如果不进行其他配置,虚拟环境是默认模式。

如果项目解释器(存储在 .pdm-python 中的解释器,可以通过 pdm info 检查)来自虚拟环境,则将使用虚拟环境。

虚拟环境自动创建

默认情况下,PDM 倾向于使用与其他包管理器相同的虚拟环境布局。当您第一次在尚未确定 Python 解释器的新 PDM 管理项目上运行 pdm install 时,PDM 将在 <project_root>/.venv 中创建一个虚拟环境,并将依赖项安装到其中。在 pdm init 的交互式会话中,PDM 也会询问是否为您创建虚拟环境。

您可以选择 PDM 用于创建虚拟环境的后端。目前它支持三个后端:

您可以通过 pdm config venv.backend [virtualenv|venv|conda] 进行更改。

+++ 2.13.0

此外,当 python.use_venv 配置设置为 true 时,使用 pdm use 切换 Python 解释器时,PDM 将始终尝试创建虚拟环境。

自己创建虚拟环境

您可以使用任何您想要的 Python 版本创建多个虚拟环境。

  1. # 基于 3.8 解释器创建虚拟环境
  2. pdm venv create 3.8
  3. # 分配一个不同于版本字符串的名称
  4. pdm venv create --name for-test 3.8
  5. # 使用 venv 作为后端创建,支持 3 个后端:virtualenv(默认)、venv、conda
  6. pdm venv create --with venv 3.9

虚拟环境的位置

如果未给出 --name,PDM 将在 <project_root>/.venv 中创建 venv。否则,虚拟环境将位于 venv.location 配置指定的位置。 它们被命名为 <project_name>-<path_hash>-<name_or_python_version>,以避免名称冲突。 您可以通过 pdm config venv.in_project false 禁用项目内虚拟环境的创建。然后,所有虚拟环境将在 venv.location 下创建。

重用您在其他地方创建的虚拟环境

您可以告诉 PDM 使用您在前面的步骤中创建的虚拟环境,使用 pdm use

  1. pdm use -f /path/to/venv

虚拟环境自动检测

当项目配置中没有存储解释器或设置了 PDM_IGNORE_SAVED_PYTHON 环境变量时,PDM 将尝试检测可能要使用的虚拟环境:

  • 项目根目录中的 venvenv.venv 目录
  • 当前激活的虚拟环境,除非设置了 PDM_IGNORE_ACTIVE_VENV

列出项目创建的所有虚拟环境

  1. $ pdm venv list
  2. 由该项目创建的虚拟环境:
  3. - 3.8.6: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-3.8.6
  4. - for-test: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test
  5. - 3.9.1: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-3.9.1

显示虚拟环境的路径或 Python 解释器

  1. pdm venv --path for-test
  2. pdm venv --python for-test

删除虚拟环境

  1. $ pdm venv remove for-test
  2. 由该项目创建的虚拟环境:
  3. 将删除:C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test,继续?[y/N]:y
  4. 已删除 C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test

激活虚拟环境

pipenvpoetry 不同,pdm venv 不会为您创建子 shell,而是将激活命令打印到控制台。这样您就不会离开当前 shell。然后,您可以将输出传递给 eval 以激活虚拟环境:

=== “bash/csh/zsh”

  1. ```bash
  2. $ eval $(pdm venv activate for-test)
  3. (test-project-for-test) $ # 已进入虚拟环境
  4. ```

=== “Fish”

  1. ```bash
  2. $ eval (pdm venv activate for-test)
  3. ```

=== “Powershell”

  1. ```ps1
  2. PS1> Invoke-Expression (pdm venv activate for-test)
  3. ```
  4. 此外,如果项目解释器是 venv Python,您可以省略 activate 后的名称参数。

!!! 注意 venv activate 不会 切换项目使用的 Python 解释器。它只通过向环境变量注入虚拟环境路径来更改 shell。为了实现前述目的,请使用 pdm use 命令。

有关更多 CLI 用法,请查看 pdm venv 文档。

!!! TIP “寻找 pdm shell?” PDM 没有提供 shell 命令,因为许多高级 shell 函数可能在子 shell 中无法完美工作,这给支持所有特殊情况带来了维护负担。然而,您仍然可以通过以下方式获得能力:

  1. - 使用 `pdm run $SHELL`,这将使用正确设置的环境变量生成一个子 shell。**子 shell 可以通过 `exit` `Ctrl+D` 退出。**
  2. - 添加一个 shell 函数来激活虚拟环境,这里是一个在 BASH 上工作的例子,也适用于 ZSH
  3. ```bash
  4. pdm() {
  5. local command=$1
  6. if [[ "$command" == "shell" ]]; then
  7. eval $(pdm venv activate)
  8. else
  9. command pdm $@
  10. fi
  11. }
  12. ```
  13. 将此函数复制并粘贴到您的 `~/.bashrc` 文件中,并重新启动您的 shell
  14. 对于 `fish` shell,您可以将以下内容放入 `~/fish/config.fish` `~/.config/fish/config.fish`
  15. ```fish
  16. function pdm
  17. set cmd $argv[1]
  18. if test "$cmd" = "shell"
  19. eval (pdm venv activate)
  20. else
  21. command pdm $argv
  22. end
  23. end
  24. ```
  25. 现在,您可以运行 `pdm shell` 来激活虚拟环境。
  26. **虚拟环境可以像平常一样使用 `deactivate` 命令停用。**

提示自定义

默认情况下,当您激活虚拟环境时,提示将显示:{project_name}-{python_version}

例如,如果您的项目名为 test-project

  1. $ eval $(pdm venv activate for-test)
  2. (test-project-3.10) $ # {project_name} == test-project 和 {python_version} == 3.10

您可以在创建虚拟环境之前使用 venv.prompt 配置或 PDM_VENV_PROMPT 环境变量(在 pdm initpdm venv create 之前)自定义格式。 可用变量有:

  • project_name: 您的项目名称
  • python_version: Python 版本(虚拟环境中使用的)
  1. $ PDM_VENV_PROMPT='{project_name}-py{python_version}' pdm venv create --name test-prompt
  2. $ eval $(pdm venv activate test-prompt)
  3. (test-project-py3.10) $

不激活虚拟环境就在里面运行命令

  1. # 运行脚本
  2. pdm run --venv test test
  3. # 安装包
  4. pdm sync --venv test
  5. # 列出已安装的包
  6. pdm list --venv test

其他支持 --venv 标志或 PDM_IN_VENV 环境变量的命令,请查看 CLI 参考。您应该先使用 pdm venv create --name <name> 创建虚拟环境,然后再使用此功能。

将虚拟环境切换为项目环境

默认情况下,如果您使用 pdm use 并选择一个非 venv Python,项目将切换到PEP 582 模式。我们还允许您通过 --venv 标志切换到命名的虚拟环境:

  1. # 切换到名为 test 的虚拟环境
  2. $ pdm use --venv test
  3. # 切换到位于 $PROJECT_ROOT/.venv 的项目内 venv
  4. $ pdm use --venv in-project

禁用虚拟环境模式

您可以通过 pdm config python.use_venv false 禁用虚拟环境的自动创建和自动检测。 如果禁用了 venv,即使选定的解释器来自虚拟环境,也将始终使用 PEP 582 模式。

在虚拟环境中包含 pip

默认情况下,PDM 不会在虚拟环境中包含 pip。 这通过确保只有您的依赖项被安装在虚拟环境中来增加隔离性。

如果您想在 CI 中安装任意依赖项,可以运行一次安装 pip

  1. # 在虚拟环境中安装 pip
  2. pdm run python -m ensurepip
  3. # 安装任意依赖项
  4. # 这些依赖项不会与锁定文件中的依赖项检查冲突!
  5. pdm run python -m pip install coverage

或者,您可以在创建虚拟环境时使用 --with-pip

  1. pdm venv create --with-pip 3.9

有关 ensurepip 的更多详细信息,请查看 ensurepip 文档

如果您想永久配置 PDM 在虚拟环境中包含 pip,可以使用 venv.with_pip 配置。