五分钟掌握Python虚拟环境
内容提要
Python虚拟环境用于隔离项目依赖、避免库版本冲突,且无需管理员权限即可安装包。标准库venv自Python 3.3起内置,Debian/Ubuntu需先安装python3-venv;virtualenv则支持Python 2.7。可用`python3 -m venv env`创建环境,建议存放于项目目录并加入.gitignore,或集中存放并用workon函数激活。使用方式包括激活环境、直接调用env/bin/python或子shell;非交互场景须用完整路径。迁移环境时应重建并借助requirements.txt恢复依赖。
延伸解读
venv 与 virtualenv 的选择依据
文章指出 venv 自 Python 3.3 起内置,多数用户无需安装,但 Debian/Ubuntu 需先安装 python3-venv;virtualenv 则支持 Python 2.7 并带有额外功能。作者建议优先用 venv,两者目标相同,若一个不工作可尝试另一个。选择时主要看 Python 版本和系统环境,而非功能差异。
虚拟环境存放位置的实际考量
文章给出两种存放方案:集中放在 ~/virtualenvs 便于管理,可配合 workon 函数快速激活;或放在项目目录如 .venv,但必须加入 .gitignore,避免二进制文件进入仓库。集中存放适合多项目切换,项目内存放则与代码绑定更紧密,需注意版本控制排除。
非交互场景必须使用完整路径
文章强调,在 crontab、系统服务等非交互场景中,激活环境和子 shell 都不可行,必须始终使用 Python 的完整路径。交互式使用时,激活虽方便但可能失效,直接执行 env/bin/python 更可靠。这一区分对自动化脚本和部署尤为重要。
迁移环境应重建而非复制
虚拟环境与创建时的 Python 版本和路径紧密绑定,复制或重命名后无法工作,virtualenv 的 relocatable 选项也已废弃。正确做法是在新位置新建环境,用 pip freeze > requirements.txt 导出旧环境依赖,再在新环境安装。Python 升级后也可能需要重建,因此保持 requirements.txt 更新很有必要。
Q&A
Python虚拟环境有什么作用?为什么需要它?
虚拟环境用于隔离不同项目的依赖,避免库版本冲突;允许在没有管理员权限的情况下安装和管理包,且不与系统包管理器冲突;还能快速在其他地方创建具有相同依赖的环境。
在Debian/Ubuntu上使用venv需要额外安装什么吗?
需要。Debian/Ubuntu默认不安装venv所需的一些组件,因此需要运行sudo apt-get install python3-venv来使venv正常工作。
如何创建一个Python虚拟环境?
使用python3 -m venv env(Linux)或py -m venv env(Windows)创建名为env的虚拟环境。如果使用virtualenv,则运行python3 -m virtualenv env或py -m virtualenv env。创建后会生成包含bin(Windows下为Scripts)、lib和include的文件夹。
虚拟环境应该放在哪里?有什么注意事项?
有两种选择:一是集中存放在全局位置(如~/virtualenvs),便于管理,可配合workon函数快速激活;二是放在每个项目目录下(如~/git/foobar/.venv),但必须将虚拟环境目录加入.gitignore,避免提交到仓库。
在非交互场景(如crontab或系统服务)中如何使用虚拟环境?
非交互场景下不能使用激活或子shell方式,必须始终使用Python的完整路径,例如/path/to/env/bin/python来运行脚本或安装包。
复制或重命名虚拟环境后为什么不能直接使用?如何迁移?
虚拟环境与创建时使用的Python版本和位置紧密绑定,复制或重命名后无法工作。正确做法是在新位置创建新环境,然后在旧环境中运行pip freeze > requirements.txt导出依赖列表,再在新环境中运行pip install -r requirements.txt安装依赖。
使用Docker时还需要虚拟环境吗?
仍然建议使用。虚拟环境可以保护你免受操作系统镜像中可能存在的全局Python包的影响,且不会引入额外开销,同时允许在Docker之外(如本地开发)重建干净的环境。