3分钟上手PDM虚拟环境:从混乱到秩序的Python环境管理革命
你是否还在为Python项目的环境配置而头疼?不同项目需要不同版本的依赖包,手动管理虚拟环境繁琐易错,切换环境时更是手忙脚乱?本文将带你彻底告别这些烦恼,通过PDM(Python包和依赖管理器)的虚拟环境功能,轻松实现项目环境的隔离与高效管理。读完本文,你将掌握PDM虚拟环境的创建、使用、管理全流程,让Python开发环境从此井然有序。
PDM虚拟环境简介
PDM(Python包和依赖管理器)是一个现代的Python包和依赖管理器,支持最新的PEP标准。与传统的虚拟环境管理工具相比,PDM提供了更简洁、更强大的虚拟环境管理功能,能够自动创建、检测和管理虚拟环境,让开发者专注于代码开发而非环境配置。
PDM默认使用虚拟环境模式,这被认为比PEP 582更成熟,在Python生态系统和IDE中也有更好的支持。你可以通过配置python.use_venv来切换模式,具体可参考官方文档:docs/usage/venv.md。
快速创建虚拟环境
自动创建虚拟环境
当你在一个新的PDM管理项目中首次运行pdm install命令时,如果还没有确定Python解释器,PDM会自动在项目根目录下创建一个名为.venv的虚拟环境,并将依赖安装到其中。在pdm init的交互会话中,PDM也会询问是否为你创建虚拟环境。
PDM支持三种虚拟环境后端:virtualenv(默认)、venv和conda。你可以通过以下命令更改后端:
pdm config venv.backend [virtualenv|venv|conda]
手动创建虚拟环境
你可以使用pdm venv create命令手动创建多个不同Python版本的虚拟环境。例如:
# 创建基于Python 3.9的虚拟环境
pdm venv create 3.9
# 创建指定名称的虚拟环境
pdm venv create --name for-test 3.9
# 使用venv后端创建Python 3.10的虚拟环境
pdm venv create --with venv 3.10
虚拟环境的位置与管理
虚拟环境的存储位置
如果没有指定--name,PDM会在项目根目录下创建.venv目录来存储虚拟环境。否则,虚拟环境会存储在venv.location配置指定的位置,命名格式为<project_name>-<path_hash>-<name_or_python_version>,以避免名称冲突。你可以通过pdm config venv.in_project false禁用项目内虚拟环境的创建,这样所有虚拟环境都会创建在venv.location下。
列出所有虚拟环境
使用pdm venv list命令可以列出当前项目创建的所有虚拟环境:
$ pdm venv list
Virtualenvs created with this project:
- 3.8.6: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-3.8.6
- for-test: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test
- 3.9.1: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-3.9.1
查看虚拟环境路径和Python解释器
你可以使用以下命令查看指定虚拟环境的路径和Python解释器:
pdm venv --path for-test
pdm venv --python for-test
删除虚拟环境
使用pdm venv remove命令可以删除指定的虚拟环境:
$ pdm venv remove for-test
Virtualenvs created with this project:
Will remove: C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test, continue? [y/N]:y
Removed C:\Users\Frost Ming\AppData\Local\pdm\pdm\venvs\test-project-8Sgn_62n-for-test
激活和使用虚拟环境
激活虚拟环境
PDM不像pipenv和poetry那样生成子shell,而是将激活命令打印到控制台,你可以将输出传递给eval来激活虚拟环境。
=== "bash/csh/zsh" bash $ eval $(pdm venv activate for-test) (test-project-for-test) $ # 虚拟环境已进入
=== "Fish" bash $ eval (pdm venv activate for-test)
=== "Powershell" ps1 PS1> Invoke-Expression (pdm venv activate for-test)
如果项目解释器是虚拟环境的Python,你可以省略activate后面的名称参数。
自定义虚拟环境提示符
默认情况下,激活虚拟环境后,提示符会显示为{project_name}-{python_version}。你可以通过venv.prompt配置或PDM_VENV_PROMPT环境变量来自定义提示符格式,支持project_name和python_version两个变量。例如:
$ PDM_VENV_PROMPT='{project_name}-py{python_version}' pdm venv create --name test-prompt
$ eval $(pdm venv activate test-prompt)
(test-project-py3.10) $
在不激活虚拟环境的情况下运行命令
你可以使用--venv标志在指定的虚拟环境中运行命令,而无需先激活它:
# 运行脚本
pdm run --venv test test
# 安装依赖
pdm sync --venv test
# 列出已安装的包
pdm list --venv test
更多支持--venv标志或PDM_IN_VENV环境变量的命令,请参考CLI参考文档:docs/reference/cli.md。
切换项目使用的虚拟环境
你可以使用pdm use --venv命令切换项目使用的虚拟环境:
# 切换到名为test的虚拟环境
$ pdm use --venv test
# 切换到项目内的.venv虚拟环境
$ pdm use --venv in-project
虚拟环境管理高级技巧
为虚拟环境添加shell命令支持
虽然PDM没有提供shell命令,但你可以通过添加shell函数来实现类似功能。以下是BASH/ZSH和Fish的示例函数:
BASH/ZSH函数(添加到~/.bashrc):
pdm() {
local command=$1
if [[ "$command" == "shell" ]]; then
eval $(pdm venv activate)
else
command pdm $@
fi
}
Fish函数(添加到~/fish/config.fish或~/.config/fish/config.fish):
function pdm
set cmd $argv[1]
if test "$cmd" = "shell"
eval (pdm venv activate)
else
command pdm $argv
end
end
添加后,你就可以使用pdm shell命令来激活虚拟环境,使用deactivate命令退出虚拟环境。
在虚拟环境中包含pip
默认情况下,PDM不会在虚拟环境中包含pip。如果你需要,可以通过以下方式安装pip:
# 在虚拟环境中安装pip
pdm run python -m ensurepip
# 安装任意依赖(注意:这些依赖不会与锁文件依赖冲突检查!)
pdm run python -m pip install coverage
你也可以在创建虚拟环境时使用--with-pip选项:
pdm venv create --with-pip 3.9
如果你想永久配置PDM在虚拟环境中包含pip,可以使用venv.with_pip配置,具体参考配置参考文档:docs/reference/configuration.md。
总结
通过本文的介绍,你已经掌握了PDM虚拟环境的创建、管理、使用等核心技能。PDM的虚拟环境功能为Python项目提供了简洁高效的环境隔离方案,让你彻底告别环境配置的烦恼。无论是自动创建还是手动管理,PDM都能满足你的需求,让你专注于代码开发。
现在,就开始使用PDM来管理你的Python项目环境吧!更多详细信息,请参考PDM官方文档:docs/usage/venv.md。如果你觉得本文对你有帮助,欢迎点赞、收藏、关注,后续我们将带来更多PDM使用技巧和最佳实践。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



