ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python虚拟环境创建与管理全攻略:venv、virtualenv、conda对比与实践

2026/8/6 6:28:55 拓冰建站 浏览量
Python虚拟环境创建与管理全攻略:venv、virtualenv、conda对比与实践

1. 项目概述:为什么我们需要“任意目录”的虚拟环境?

如果你写过Python,大概率遇到过这个场景:项目A需要Django 3.2,项目B需要Django 4.0,而你的系统里只有一个Python。直接安装新版本,旧项目可能就跑不起来了;用pip install --user装到用户目录,不同项目间的库还是会混在一起。更头疼的是,当你把项目打包发给同事,或者部署到服务器时,如何确保对方的环境和你一模一样,不会因为缺少某个依赖或者版本冲突而报错?

这就是虚拟环境要解决的核心问题:隔离。它像一个独立的“沙盒”,为每个Python项目创建一套专属的Python解释器和第三方库集合。在这个沙盒里,你安装、升级、卸载任何包,都不会影响到系统环境或其他项目。

那么,为什么标题要强调“任意目录”呢?传统的教程往往告诉你,先进入项目目录,再创建虚拟环境。但实际工作中,我们的项目结构可能很复杂。比如,你可能有一个/workspace目录,下面有/project_a/project_b等多个子项目。你希望虚拟环境就创建在/workspace目录下,与所有子项目平级,方便统一管理。或者,你的项目文件在D盘,但你想把虚拟环境创建在E盘的某个特定位置,以节省C盘空间。再或者,你只是想在一个临时目录里快速测试一个脚本,不想污染任何现有项目。

“在任意目录下创建”这个需求,背后是对环境管理灵活性和控制力的追求。它意味着你不再被“必须在项目根目录”的规则束缚,可以根据磁盘规划、团队规范或个人习惯,自由地决定虚拟环境的安放位置。这对于管理大型项目、多项目协作,或者使用像VSCode这类需要显式指定解释器的IDE时,尤其重要。

接下来,我会带你彻底搞懂Python虚拟环境的几种主流创建方式,重点是掌握如何精确控制它的生成位置,并分享一些只有踩过坑才知道的实操细节。

2. 核心工具选型:venv, virtualenv, 还是 conda?

面对创建虚拟环境,你至少有三种主流选择:Python内置的venv、第三方工具virtualenv、以及科学计算领域的“全家桶”conda。选哪个不是拍脑袋,得看你的具体场景。

2.1 内置王者:venv

从Python 3.3开始,标准库就内置了venv模块。如果你的Python版本是3.3或更高(现在应该没人用3.3以下了吧?),那么venv是你的首选。

优点:

  1. 无需安装:开箱即用,是Python的一部分。
  2. 轻量简洁:只做环境隔离这一件事,不附带任何额外功能。
  3. 官方推荐:是Python官方维护的工具,兼容性和稳定性有保障。

缺点:

  1. 无法创建不同Python版本的虚拟环境venv只能基于当前运行的Python解释器版本来创建环境。比如你系统装的是Python 3.9,那用venv创建的所有环境都是Python 3.9的。你无法用它创建一个Python 3.8的环境。
  2. 功能相对基础:相比virtualenv,缺少一些高级参数调优。

适用场景:绝大多数日常Python开发,尤其是当你只需要隔离项目依赖,并且所有项目都使用相同主版本的Python时。

2.2 第三方增强:virtualenv

virtualenv是一个历史更悠久的第三方工具,在venv出现之前,它是事实上的标准。

优点:

  1. 支持更旧的Python版本:可以支持到Python 2.7。
  2. 功能更丰富:提供更多命令行参数,例如--always-copy(总是复制文件而非符号链接,在某些共享文件系统上更稳定)、--no-setuptools(不安装setuptools)等。
  3. 在某些边缘情况下更可靠:经过更长时间的战斗测试。

缺点:

  1. 需要额外安装pip install virtualenv
  2. 对于Python 3.3+用户来说,优势不明显venv已经能满足90%的需求。

适用场景:需要支持Python 2.7的老项目;或者需要virtualenv特有参数的高级用户。

2.3 科学计算全家桶:conda (Anaconda/Miniconda)

conda不仅仅是一个虚拟环境管理器,它更是一个跨平台的包管理和环境管理系统。它来自Anaconda发行版。

优点:

  1. 可以管理Python版本本身:这是它和venv/virtualenv最大的不同。你可以用conda create -n myenv python=3.8直接创建一个Python 3.8的环境,即使你系统里没装3.8,conda会帮你下载安装。
  2. 强大的非Python包管理:可以安装像numpy,pandas,tensorflow这类包含C扩展的科学计算包,并能自动处理它们复杂的二进制依赖关系(这是pip的痛点)。
  3. 多语言支持:理论上可以管理R、Java等其他语言的环境。

缺点:

  1. 庞大:完整的Anaconda安装包有几个G。
  2. 可能“污染”环境:它的路径配置比较“强势”,有时会和系统Python或其他工具冲突。
  3. 包更新可能稍慢:相比PyPI,conda-forge频道的包更新可能有延迟。

适用场景:数据科学、机器学习、科学计算领域;需要频繁切换不同Python版本(如同时维护3.7, 3.8, 3.9项目);需要安装复杂二进制依赖(如带CUDA的PyTorch)。

我的选择建议:对于纯粹的Python应用开发、Web后端、自动化脚本等,优先使用venv,简单纯粹。如果你是数据科学从业者,或者项目严重依赖那些用pip安装起来很麻烦的科学包,选择condavirtualenv可以作为venv的一个功能补充备选。

3. 实战:在任意目录创建虚拟环境(以venv为例)

理论说完了,我们上手操作。这里以最常用的venv为例,目标是:D:\my_venvs目录下,为一个名为demo_project的项目创建虚拟环境,环境文件夹名叫venv_demo

3.1 基础命令与路径解析

核心命令就一行:

python -m venv /path/to/your/virtualenv

关键在于理解/path/to/your/virtualenv。这是一个目标路径参数,它告诉venv:“请在这个位置创建虚拟环境文件夹。”

所以,针对我们的目标,操作如下:

  1. 打开命令行终端(CMD, PowerShell, 或者你喜欢的终端)。
  2. 执行创建命令
    # 在Windows上 python -m venv D:\my_venvs\venv_demo # 在Linux/macOS上 python3 -m venv /home/username/my_venvs/venv_demo
    注意:Linux/macOS上,命令通常是python3。如果你系统里python命令默认指向Python 3,也可以用python

命令执行后发生了什么?venv会在D:\my_venvs目录下创建一个名为venv_demo的文件夹。这个文件夹里包含了一个完整的、独立的Python环境:

  • Scripts\(Windows) 或bin/(Linux/macOS): 存放可执行文件,包括python,pip,以及激活脚本。
  • Lib\(Windows) 或lib/python3.x/site-packages/(Linux/macOS): 存放所有通过pip安装的第三方包。
  • pyvenv.cfg: 一个配置文件,记录了创建此环境时使用的Python解释器路径等基本信息。

3.2 激活虚拟环境

创建好之后,它只是一个孤立的文件夹。要使用它,必须“激活”。

Windows (CMD/PowerShell):

# 在CMD中 D:\my_venvs\venv_demo\Scripts\activate.bat # 在PowerShell中(可能需要先修改执行策略) D:\my_venvs\venv_demo\Scripts\Activate.ps1

激活后,你的命令行提示符通常会发生变化,前面会多出(venv_demo)的字样,这表明你当前正处在这个虚拟环境中。之后所有pythonpip命令,都会指向这个环境下的版本。

Linux/macOS (bash/zsh):

source /home/username/my_venvs/venv_demo/bin/activate

同样,激活后提示符会变化。

停用虚拟环境:在任何系统下,在激活的环境中直接输入deactivate命令即可退出。

3.3 验证与使用

激活后,做两个快速验证:

  1. 检查Python解释器路径
    which python # Linux/macOS where python # Windows
    输出应该指向你刚创建的虚拟环境目录下的python可执行文件。
  2. 检查pip列表
    pip list
    在一个全新的虚拟环境里,通常只有pip,setuptools,wheel这几个基础包,非常干净。

现在,你就可以在这个环境里为你的demo_project安装专属依赖了,比如pip install django==3.2.5,完全不用担心影响其他项目。

4. 高级技巧与避坑指南

掌握了基础操作,下面这些经验能让你用得更顺手,少踩80%的坑。

4.1 使用--prompt自定义提示符

当你有多个虚拟环境时,仅靠路径名可能不好区分。venv提供了--prompt参数,让你自定义激活后的提示符前缀。

python -m venv D:\my_venvs\venv_demo --prompt “Demo_Project”

激活后,你的提示符会变成(Demo_Project) C:\Users\...,一目了然。

4.2 创建“干净”或“链接”环境

venv创建环境时,默认会尝试使用符号链接(symlinks)来指向系统Python的标准库,以节省空间和创建时间。但在某些网络文件系统或Windows的某些配置下,符号链接可能有问题。

  • --copies: 强制使用复制文件的方式,而不是创建符号链接。这样创建的环境更“干净”独立,但体积稍大,创建稍慢。
    python -m venv D:\my_venvs\venv_demo --copies
  • --symlinks: 明确指定使用符号链接(默认行为)。在支持符号链接的系统上,这是更高效的方式。

实操心得:在Windows上,如果遇到虚拟环境激活后运行Python报一些奇怪的权限或路径错误,可以尝试加上--copies参数重新创建环境,这能解决大部分因符号链接引起的问题。

4.3 在VSCode中指定虚拟环境解释器

这是很多人的痛点。你创建了虚拟环境,但在VSCode里运行代码,用的还是系统Python。

正确配置步骤:

  1. 在VSCode中打开你的项目文件夹(比如D:\projects\demo_project)。
  2. 按下Ctrl+Shift+P(Windows/Linux) 或Cmd+Shift+P(macOS),打开命令面板。
  3. 输入并选择“Python: Select Interpreter”
  4. 在弹出的列表中,VSCode会自动扫描常见的虚拟环境位置。如果你在任意目录创建的环境没被扫描到,选择列表最下方的“Enter interpreter path...”
  5. 点击“Find...”,然后手动导航到你创建的虚拟环境文件夹,选择里面的python可执行文件(Windows上是python.exe,通常在Scripts子目录下;Linux/macOS是bin/python)。
  6. 选择后,VSCode左下角的状态栏会显示当前使用的Python解释器,已经变成了你的虚拟环境路径(如Python 3.9.7 (‘venv_demo’: venv))。

关键点:VSCode是通过.vscode/settings.json文件来记录项目级设置的。完成上述操作后,它会在这个文件里添加类似下面的配置:

{ "python.defaultInterpreterPath": "D:\\my_venvs\\venv_demo\\Scripts\\python.exe" }

这样,每次打开这个项目,VSCode都会自动使用你指定的虚拟环境。

4.4 虚拟环境的迁移与复用

虚拟环境文件夹(如venv_demo)是不能直接复制到另一台电脑或另一个位置就用的,因为里面的pyvenv.cfg和可执行文件中的路径信息是硬编码的。

正确的迁移方式:

  1. 在原环境中,生成依赖清单:
    pip freeze > requirements.txt
    这个requirements.txt文件记录了所有包及其精确版本。
  2. 将你的项目代码和这个requirements.txt文件拷贝到新位置。
  3. 在新位置,用venv创建一个新的虚拟环境。
  4. 激活新环境,安装依赖:
    pip install -r requirements.txt

这才是跨环境复现的正确姿势。

4.5 清理与删除虚拟环境

删除虚拟环境非常简单粗暴:直接删除整个虚拟环境文件夹即可。因为它是完全自包含的,删除文件夹就等于移除了整个环境,不会在系统留下任何残留(除了你项目目录下的requirements.txt)。这也是虚拟环境隔离性好的一个体现。

# 在文件管理器里直接删除,或者用命令行 rm -rf /home/username/my_venvs/venv_demo # Linux/macOS rd /s /q D:\my_venvs\venv_demo # Windows CMD

5. 常见问题排查实录

即使按照步骤操作,也可能会遇到问题。这里记录几个最常见的情况和解决方法。

5.1 创建虚拟环境时报错:“Error: [Errno 2] No such file or directory”

问题描述:执行python -m venv myenv后,提示找不到文件或目录。可能原因与解决

  1. 路径不存在:你指定的目标路径的父目录不存在。比如你想创建D:\code\project\venv,但D:\code\project这个目录还不存在。解决:先创建父目录。
  2. 权限不足:在Linux/macOS上,试图在/usr/local等系统目录下创建环境而没有sudo权限。解决:在用户家目录或有写权限的目录下创建。
  3. Python模块问题:极少数情况下,Python安装不完整,缺少venv模块(多见于从源码编译安装时)。解决:确保使用标准安装包,或尝试安装python3-venv包(Ubuntu/Debian:sudo apt install python3-venv)。

5.2 激活环境后,python/pip命令未找到或报错

问题描述:在Windows上执行了activate.bat,提示符变了,但运行pythonpip时提示“不是内部或外部命令”。可能原因与解决

  1. 激活脚本路径错误:你可能没有在虚拟环境的Scripts目录下执行激活命令,或者路径写错了。解决:检查路径,确保指向正确的activate.batActivate.ps1
  2. PowerShell执行策略限制:在PowerShell中,默认执行策略可能阻止脚本运行。解决:以管理员身份打开PowerShell,运行Set-ExecutionPolicy RemoteSigned(选择[A]全是),这允许运行本地脚本。完成后,再重新激活。
  3. 虚拟环境创建不完整:可能在创建过程中被中断。解决:删除该环境文件夹,重新创建。

5.3 在虚拟环境中安装包速度慢或失败

问题描述pip install卡住或报超时错误。可能原因与解决

  1. 网络问题:连接PyPI官方源速度慢。解决:使用国内镜像源。在安装时指定:
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
    或者,一劳永逸地配置默认镜像源。在虚拟环境中,创建或修改pip.conf文件:
    • Windows:%APPDATA%\pip\pip.ini
    • Linux/macOS:~/.pip/pip.conf~/.config/pip/pip.conf内容如下:
    [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn
  2. 包依赖冲突:要安装的包与现有包版本不兼容。解决:仔细阅读错误信息,尝试先升级pipsetuptoolspip install --upgrade pip setuptools wheel。如果冲突复杂,可以考虑使用pipenvpoetry这类更高级的依赖管理工具。

5.4 虚拟环境占用空间过大

问题描述:一个简单的项目,虚拟环境文件夹有好几百MB甚至上GB。可能原因与解决

  1. 安装了大型科学计算包:如numpy,pandas,tensorflow,它们本身带有大量的二进制文件和依赖。解决:这是正常现象。如果磁盘空间紧张,可以考虑使用conda,它有时能通过共享包缓存来优化空间,或者只安装项目真正需要的、最小版本的包。
  2. --copies参数的影响:使用--copies会复制文件,比默认的符号链接占用更多空间。解决:如果空间敏感且系统支持符号链接,可以尝试不使用--copies参数。
  3. 缓存文件pip的缓存和编译产生的__pycache__目录也会占空间。解决:可以定期清理pip cachepip cache purge。但注意,清理缓存后,下次安装包需要重新下载。

掌握了从创建、激活、使用到排错的全流程,你现在已经可以游刃有余地在任何目录、为任何项目搭建专属的Python工作空间了。虚拟环境是Python开发中最基础也最重要的工程实践之一,花时间熟悉它,能为你后续的项目管理省下无数麻烦。