使用虚拟环境#
当你运行 pdm init
命令时,PDM 询问要使用的Python解释器 ,这是安装依赖项和运行任务的基本解释器。
与 PEP 582 相比,虚拟环境被认为更加成熟,并且在 Python 生态系统以及 IDE 中有更好的支持。因此,默认情况下,如果未另行配置,PDM 将使用虚拟环境模式。
配置 pdm 使用虚拟环境或 PEP 582
默认情况下,pdm 被配置为使用虚拟环境而不是 PEP 582。 但这个行为可以通过设置配置变量 pdm config python.use_venv False
来改变。
如果项目解释器(存储在 .pdm-python
中的解释器,可以通过 pdm info
检查)来自虚拟环境,则将使用虚拟环境。
虚拟环境自动创建#
默认情况下,PDM 倾向于使用其他包管理器所使用的虚拟环境布局。当你在一个新的由 PDM 管理的项目上第一次运行 pdm install
,且该项目的 Python 解释器尚未确定时,PDM 将在 <project_root>/.venv
中创建一个虚拟环境,并在其中安装依赖项。在 pdm init
的交互会话中,PDM 也会询问是否为你创建一个虚拟环境。
你可以选择由 PDM 使用的虚拟环境创建后端。目前支持三种后端:
virtualenv
(默认)venv
conda
你可以通过 pdm config venv.backend [virtualenv|venv|conda]
进行更改。
在版本 2.13.0 中添加
此外,当 python.use_venv
配置设置为 true
时,PDM 在使用 pdm use
切换Python解释器时将始终尝试创建虚拟环境。
自己创建虚拟环境#
你可以创建任意Python版本的多个虚拟环境。
1 2 3 4 5 6 |
|
虚拟环境的位置#
如果没有给出 --name
,PDM 将在 <project_root>/.venv
中创建虚拟环境。否则,虚拟环境将保存在由 venv.location
配置指定的位置。
它们的命名方式是 <project_name>-<path_hash>-<name_or_python_version>
,以避免名称冲突。
你可以通过 pdm config venv.in_project false
来禁用项目内部的虚拟环境创建。所有虚拟环境都将创建在 venv.location
下。
重用你在其他地方创建的虚拟环境#
你可以告诉PDM使用你在之前步骤中创建的虚拟环境,使用 pdm use
:
1 |
|
虚拟环境自动检测#
当项目配置中未存储解释器,或者设置了 PDM_IGNORE_SAVED_PYTHON
环境变量时,PDM 将尝试检测可能使用的虚拟环境:
- 项目根目录中的
venv
、env
、.venv
目录 - 当前激活的虚拟环境,除非设置了
PDM_IGNORE_ACTIVE_VENV
列出所有与此项目创建的虚拟环境#
1 2 3 4 5 6 |
|
显示虚拟环境的路径或Python解释器#
1 2 |
|
删除虚拟环境#
1 2 3 4 |
|
激活虚拟环境#
与 pipenv
和 poetry
不同,pdm venv
不会为你创建子shell,而是将激活命令打印到控制台。这样你就不会离开当前shell。然后你可以将输出提供给 eval
以激活虚拟环境:
1 2 |
|
1 |
|
1 |
|
另外,如果项目解释器是一个 venv Python,你可以省略跟在 activate 后的名称参数。
Note
venv activate
不会 切换项目使用的Python解释器。它仅通过将虚拟环境路径注入到环境变量中来更改shell。对于前述目的,请使用 pdm use
命令。
更多CLI使用方法,请参阅 pdm venv
documentation.
寻找 pdm shell
?
PDM 不提供 shell
命令,因为许多复杂的 shell 函数在子 shell 中可能无法完美工作,这会给支持所有边缘情况带来维护负担。但是,你仍然可以通过以下方式获得此功能:
- 使用
pdm run $SHELL
,这将以正确设置环境变量的方式生成一个子shell。子shell 可以使用exit
或Ctrl+D
退出。 - 添加一个激活虚拟环境的shell函数,以下是一个在BASH中也适用于ZSH的示例:
1 2 3 4 5 6 7 8 9 |
|
复制并粘贴此函数到你的 ~/.bashrc
文件中,并重新启动shell。
对于 fish
shell,你可以将以下内容放入你的 ~/fish/config.fish
或 ~/.config/fish/config.fish
:
1 2 3 4 5 6 7 8 9 |
|
现在你可以运行 pdm shell
来激活虚拟环境。
虚拟环境可以像往常一样使用 deactivate
命令来停用。
提示定制#
默认情况下,当你激活一个虚拟环境时,提示将显示为:{project_name}-{python_version}
。
例如,如果你的项目名为 test-project
:
1 2 |
|
格式可以在虚拟环境创建之前通过 venv.prompt
配置或 PDM_VENV_PROMPT
环境变量进行自定义(在 pdm init
或 pdm venv create
之前)。
可用的变量有:
project_name
: 你的项目名称python_version
: Python版本(用于虚拟环境)
1 2 3 |
|
在不激活虚拟环境的情况下运行虚拟环境中的命令#
1 2 3 4 5 6 |
|
还有其他支持 --venv
标志或 PDM_IN_VENV
环境变量的命令,请参阅 CLI reference。在使用此功能之前,你应该使用 pdm venv create --name <name>
创建虚拟环境。
将虚拟环境切换为项目环境#
默认情况下,如果你使用 pdm use 并选择了非 venv 的Python,则项目将切换到 PEP 582 模式。我们还允许你通过 --venv
标志切换到一个命名的虚拟环境:
1 2 3 4 |
|
禁用虚拟环境模式#
你可以通过 pdm config python.use_venv false
来禁用虚拟环境的自动创建和自动检测。
如果禁用了 venv,即使选择的解释器来自虚拟环境,PDM 也将始终使用 PEP 582 模式。
在虚拟环境中包含pip#
默认情况下,PDM 不会在虚拟环境中包含 pip。 这增加了隔离性,确保虚拟环境中仅安装了 你当前项目的依赖项。
要安装 pip
一次(例如,如果你想在CI中安装任意依赖项),你可以运行:
1 2 3 4 5 |
|
或者你可以使用 --with-pip
在创建虚拟环境时包含 pip
:
1 |
|
有关 ensurepip 的更多详细信息,请参阅 ensurepip 文档。
如果你想永久配置PDM以在虚拟环境中包含 pip,你可以使用 venv.with_pip
配置。