ARTICLE DETAIL

建站实战干货

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

Python venv 虚拟环境与 pip 包管理完全指南:创建、激活与依赖隔离

2026/9/10 16:40:24 拓冰建站 浏览量
Python venv 虚拟环境与 pip 包管理完全指南:创建、激活与依赖隔离 Python venv 虚拟环境与 pip 包管理完全指南创建、激活与依赖隔离【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython导读venv是 Python 标准库中用于创建虚拟环境virtual environment的模块它把某一特定版本的 Python 解释器与一批第三方包装进一个自包含的目录树中使不同应用可以在各自环境里使用互不冲突的依赖版本。本指南基于 CPython 官方教程 Doc/tutorial/venv.rst并结合 Lib/venv/init.py 的真实实现完整讲解虚拟环境的背景动机、创建与激活方法、各平台激活脚本差异、以及用 pip 安装/升级/卸载/导出依赖的完整工作流。读完本文你将能独立为任意 Python 项目搭建隔离环境并熟练使用requirements.txt复现依赖。一、为什么需要虚拟环境依赖冲突的根源Python 应用常常依赖标准库之外的第三方包而不同应用对同一库的版本要求可能截然不同应用 A 依赖某个模块的1.0 版本因为其代码按旧接口编写应用 B 需要同一模块的2.0 版本因为它要求 1.0 中存在的一个 bug 已被修复。若只有一个全局 Python 安装无论装 1.0 还是 2.0都必然让另一个应用无法运行——这就是依赖冲突问题。虚拟环境的解决思路正如 Doc/glossary.rst 中对该术语的定义一个协同隔离的运行时环境允许用户和应用安装、升级 Python 发行包而不会干扰同一系统上运行的其他 Python 应用。具体做法是应用 A 使用装了 1.0 的环境应用 B 使用装了 2.0 的另一环境当应用 B 需要把某个库升级到 3.0 时也完全不影响应用 A 的环境。在 Lib/venv/init.py 的模块 docstring 中写明了其设计依据Virtual environment (venv) package for Python. Based on PEP 405.——即该机制由 PEP 405 标准化。二、创建虚拟环境python -m venv负责创建和管理虚拟环境的标准库模块就叫 venv。其关键行为是venv 会安装运行命令所用解释器的那个 Python 版本与--version选项报告的一致。例如用python3.12执行命令装进环境的就是 3.12。在选定存放目录后把 venv 模块当作脚本运行并传入目录路径即可$ python -m venv tutorial-env该命令会在tutorial-env不存在时创建它并在其内部生成包含 Python 解释器副本和各类支持文件的子目录。从源码看ensure_directories() 会依次创建bin/Windows 上为Scripts/存放解释器可执行文件与激活脚本lib/pythonX.Y/site-packages/Windows 上为Lib/本环境的第三方包安装位置include/遵循 PEP 405 要求创建的本地头文件目录Windows 上为Include。目录命名建议.venv而非tutorial-env官方教程建议常见的命名是.venv理由有三以.开头使其在 shell 中默认隐藏保持项目根目录整洁名称本身自解释一眼看出它是 virtual environment不会与某些工具支持的.env环境变量定义文件混淆冲突。创建时究竟发生了什么结合 EnvBuilder.create()一次创建操作的核心步骤包括ensure_directories()计算并建立bin、lib、include目录结构上文所述create_configuration()写出 pyvenv.cfg 配置文件setup_python()把宿主解释器以符号链接POSIX 默认或复制Windows 默认的方式放入环境。POSIX 分支还会顺带生成python、python3、python3.X三个入口Lib/venv/init.py_setup_pip()默认开启调用新环境的 Python 执行ensurepip --upgrade --default-pip引导安装 pipLib/venv/init.pysetup_scripts()把激活/停用脚本装入bin或ScriptsLib/venv/init.py。生成的pyvenv.cfg会记录环境与宿主的关系例如home /usr/local/bin include-system-site-packages false version 3.13.0 executable /usr/local/bin/python3.13 command /usr/local/bin/python3.13 -m venv /path/to/tutorial-envhome宿主 Python 所在目录该环境解释器的符号链接目标include-system-site-packages是否向环境暴露全局 site-packages默认falseversion创建环境的 Python 版本号command重建该环境的完整命令行用于诊断复现。venv 命令行选项速查python -m venv的实际入口在 Lib/venv/main.py参数解析位于 Lib/venv/init.py主要选项如下选项作用默认值ENV_DIR必填可多个目标目录一次可创建多个环境—--system-site-packages让环境可访问系统的全局 site-packages关闭--symlinks/--copies强制用符号链接 / 强制用复制默认 POSIX 用链接、Windows 用复制平台默认--clear若目标目录已存在则先清空其内容再创建关闭--upgrade就地升级已有环境到当前 Python 版本关闭--without-pip跳过 pip 的引导安装pip 默认被引导--prompt PROMPT自定义激活后 shell 提示符前缀使用目录名--upgrade-deps将核心依赖pip升级到 PyPI 最新版关闭--without-scm-ignore-files不生成 SCM 忽略文件默认生成 Git 的.gitignore例如为当前项目创建标准隔离环境$ python -m venv .venv注意--upgrade与--clear不能同时使用Lib/venv/init.py 会抛出ValueError。三、激活与停用虚拟环境创建完成后需要激活使 shell 会话中的python指向环境内的解释器。各平台激活命令Windows在tutorial-env目录所在会话中tutorial-env\Scripts\activateUnix 或 macOSbash shellsource tutorial-env/bin/activate激活脚本按 shell 分发对应源码位于 Lib/venv/scriptsbash 用common/activate、csh 用posix/activate.csh、fish 用common/activate.fish、PowerShell 用common/Activate.ps1、Windows cmd 用nt/activate.bat。原文档特别提示若你使用csh 或 fish请改用相应的activate.csh与activate.fish。激活后发生了什么激活会做两件事以 Lib/venv/scripts/common/activate 的实现为准修改 shell 提示符在PS1前加(环境名)例如$ source ~/envs/tutorial-env/bin/activate (tutorial-env) $修改环境变量导出VIRTUAL_ENV、VIRTUAL_ENV_PROMPT并把$VIRTUAL_ENV/bin插入PATH最前使python、pip均来自当前环境。此时sys.path指向环境自身的site-packages(tutorial-env) $ python Python 3.5.1 (default, May 6 2016, 10:59:36) ... import sys sys.path [, /usr/local/lib/python35.zip, ..., ~/envs/tutorial-env/lib/python3.5/site-packages] 同时脚本会清空PYTHONHOMELib/venv/scripts/common/activate并调用hash -r刷新命令缓存。关键警告激活不会改动PYTHONPATH原文档特别强调激活虚拟环境不会以任何方式修改PYTHONPATH变量。如果PYTHONPATH中含有与当前环境 Python 版本不兼容的代码路径可能引发意外结果。最佳实践是在 bash 中执行unset PYTHONPATH其他 shell 使用对应的等效写法。停用虚拟环境在终端中键入(tutorial-env) $ deactivatedeactivate会还原被保存的PATH、PS1并删除VIRTUAL_ENV、VIRTUAL_ENV_PROMPTLib/venv/scripts/common/activate。四、用 pip 管理第三方包进入环境后即可用 pip 安装、升级、卸载包。默认情况下 pip 从Python Package IndexPyPI获取包。pip 拥有install、uninstall、freeze等众多子命令。下文示例中的novas、requests仅为演示包名教程采用python -m pip形式调用以保证使用的是当前环境内的 pip。安装最新版本指定包名即可安装最新版(tutorial-env) $ python -m pip install novas Collecting novas Downloading novas-3.1.1.3.tar.gz (136kB) Installing collected packages: novas Running setup.py install for novas Successfully installed novas-3.1.1.3安装指定版本用包名版本号精确指定版本(tutorial-env) $ python -m pip install requests2.6.0 Collecting requests2.6.0 Using cached requests-2.6.0-py2.py3-none-any.whl Installing collected packages: requests Successfully installed requests-2.6.0若重复执行该命令pip 会发现目标版本已安装而不做任何操作换用其他版本号则安装对应版本。升级到最新版使用--upgrade将包升级到最新版(tutorial-env) $ python -m pip install --upgrade requests Collecting requests Installing collected packages: requests Found existing installation: requests 2.6.0 Uninstalling requests-2.6.0: Successfully uninstalled requests-2.6.0 Successfully installed requests-2.7.0卸载与查看卸载uninstall后跟一个或多个包名即可从环境中移除(tutorial-env) $ python -m pip uninstall requests查看单个包信息用show展示包的元数据(tutorial-env) $ python -m pip show requests --- Metadata-Version: 2.0 Name: requests Version: 2.7.0 Summary: Python HTTP for Humans. Home-page: http://python-requests.org Author: Kenneth Reitz Author-email: mekennethreitz.com License: Apache 2.0 Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages Requires:其中Location直接指向该虚拟环境自身的site-packages目录直观体现了依赖隔离效果。列出全部已装包用list(tutorial-env) $ python -m pip list novas (3.1.1.3) numpy (1.9.2) pip (7.0.3) requests (2.7.0) setuptools (16.0)五、用 requirements.txt 冻结与复现依赖pip freeze会输出与install输入格式一致的已装包清单因此是记录与复现依赖的利器。常见做法是把输出写入requirements.txt(tutorial-env) $ python -m pip freeze requirements.txt (tutorial-env) $ cat requirements.txt novas3.1.1.3 numpy1.9.2 requests2.7.0之后将requirements.txt提交到版本控制并随应用一起发布。其他开发者/服务器只需一条命令即可安装全部所需依赖(tutorial-env) $ python -m pip install -r requirements.txt Collecting novas3.1.1.3 (from -r requirements.txt (line 1)) ... Collecting numpy1.9.2 (from -r requirements.txt (line 2)) ... Collecting requests2.7.0 (from -r requirements.txt (line 3)) ... Installing collected packages: novas, numpy, requests Running setup.py install for novas Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0这套「freeze → 入库 →-r还原」的工作流正是现代 Python 项目依赖锁定的基础形态。六、源码级速览venv 的实现骨架理解venv的源码能让排查问题更有把握。整个实现集中在标准库 Lib/venv/init.py约 700 行其骨架是 EnvBuilder 类——官方文档称该类允许定制虚拟环境创建过程构造参数包括system_site_packages为True时向环境开放全局 site-packagesclear目标目录已存在时先清空再创建symlinksTrue用符号链接、False用复制、None采用平台默认Lib/venv/init.py 中os.name ! nt即非 Windows 默认链接upgrade/with_pip/prompt/upgrade_deps/scm_ignore_files等。从结构可以推断EnvBuilder 预留了供子类覆写的扩展点create()在创建流程末尾调用post_setup()默认空实现Lib/venv/init.py子类可在此追加安装额外包或脚本——这正是很多脚手架工具定制 venv 的入口。模块级还提供了便捷函数 create() 供程序化调用。值得注意的细节即使不激活环境也可以直接调用环境内的解释器来运行其中的包例如在 CI 中省去激活步骤激活的意义仅在于让python/pip等命令名默认指向环境。七、延伸阅读venv 模块官方参考文档全部 CLI 选项与EnvBuilderAPI 的权威说明安装 Python 模块pip 完整文档本教程中 pip 相关章节的完整参考安装 Python 包教程编写并分发你自己的包到 PyPI 的入门指引词汇表virtual environment官方术语定义PEP 405venv 机制的设计规格与背景。结语从本教程可见venv pip 的组合提供了完整的最小依赖隔离方案python -m venv创建自包含目录树激活脚本按 shell 精准地改写PATH与提示符而freeze/requirements.txt/install -r则让依赖状态可记录、可复现。理解 Lib/venv/init.py 中pyvenv.cfg、site-packages、setup_python的实现逻辑能帮助你在遇到环境异常时快速定位是「链接失败」「pip 未引导」还是「PYTHONPATH残留」等原因从而把虚拟环境真正变成可控的工程资产。【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考