Python虚拟环境venv与pip依赖管理使用教程及常见报错
很多Python项目跑不起来,不是代码本身的问题,而是依赖环境乱了。例如:pip install requests提示成功,运行时却报ModuleNotFoundError;升级了一个包的版本,另一个项目跟着挂掉;代码换到新电脑后缺少一堆包。这些问题的根源通常是:所有项目共用同一个全局Python环境,第三方包都堆在一起,互相干扰。Python自带的venv可以为每个项目创建独立的虚拟环境,pip负责安装包,requirements.txt负责把当前环境里的依赖清单保存下来。下面把这条流程完整过一遍。
一、用venv为项目创建独立环境
先在终端进入项目根目录。不同系统下的创建和激活命令如下:
Windows cmd:
cd /d D:\myproject
python -m venv venv
venv\Scripts\activate
Windows PowerShell:
cd D:\myproject
python -m venv venv
.\venv\Scripts\Activate.ps1
macOS / Linux:
cd ~/myproject
python3 -m venv venv
source venv/bin/activate
如果电脑里安装了多个Python版本,想在创建虚拟环境时指定版本,可以这样写:
py -3.13 -m venv venv
看到命令行提示符最前面出现(venv),说明虚拟环境已经激活。例如:
激活前:
C:\myproject>
激活后:
(venv) C:\myproject>
工作完成后,在终端执行deactivate即可退出虚拟环境。
二、验证pip是否真的进入了当前项目
激活前后分别执行一次以下命令:
pip --version
未激活时,pip路径指向全局Python目录。激活后,pip路径应该变成当前项目下venv目录中的site-packages。路径发生变化,说明后续pip安装的包都会进入这个项目的虚拟环境,不会污染其他项目。
如果担心当前终端里的pip不是项目环境的pip,可以改用python -m pip install,这样pip一定会跟随当前python解释器,不会装错位置。
三、编辑器需要手动连接venv
在VSCode中新建venv后,编辑器不会自动使用它。需要手动选择解释器:
按Ctrl+Shift+P,输入Python: Select Interpreter,选择带有venv路径的python.exe。
选择成功后,VSCode右下角会显示venv标识。
PyCharm在新建项目时默认会创建并启用venv,通常不需要手动配置。
四、pip常用命令与国内镜像源
日常开发中,pip这几个命令足够用:
pip install requests
pip install requests==2.31.0
pip list
pip show requests
pip uninstall requests
pip默认从PyPI官方源下载,速度慢且容易超时。可以使用清华镜像提升速度:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
如果希望以后自动使用镜像,不用每次手动加参数,可以写入pip配置:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
清华源偶尔不稳定,可以换成阿里源:
https://mirrors.aliyun.com/pypi/simple/
五、用requirements.txt保存和恢复环境
虚拟环境解决的是项目之间依赖冲突,requirements.txt解决的是环境迁移问题。
导出当前环境的依赖清单:
pip freeze > requirements.txt
生成的requirements.txt是纯文本,内容类似:
requests==2.32.3
charset-normalizer==3.3.2
idna==3.7
urllib3==2.2.0
certifi==2024.8.30
新电脑或新环境恢复依赖时三步完成:
第一步,创建虚拟环境:
python -m venv venv
第二步,激活虚拟环境。Windows cmd执行venv\Scripts\activate,macOS/Linux执行source venv/bin/activate。
第三步,根据清单安装依赖:
pip install -r requirements.txt
以后的标准工作流就是:创建venv,用pip安装依赖,执行pip freeze > requirements.txt保存清单。项目迁移时只需要拷贝代码和requirements.txt,不需要拷贝venv文件夹本身。
六、代码中import报错的终极排查顺序
装包成功但import仍报ModuleNotFoundError时,按下面顺序排查:
1. 检查虚拟环境是否激活:命令行前缀有没有(venv)。
2. 确认包是否真的安装在了当前环境:执行python -m pip list,看包是否在列表中。
3. 检查编辑器解释器是否指向当前venv:在VSCode中查看右下角解释器状态,或重新执行Python: Select Interpreter。
这样基本能覆盖大多数import失败场景。
七、常见报错处理
1. PowerShell激活时报错“在此系统上禁止运行脚本”
这是因为PowerShell默认禁止执行脚本。以当前用户身份放开本地脚本执行权限即可,不需要管理员:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
确认后,重开终端再激活venv。
2. 激活后没有(venv),pip还是全局的
确认当前目录是不是项目根目录,激活的是不是对应终端。如果拿不准,直接用python -m pip install代替pip install,这样装包位置会跟当前python环境一致。
3. pip下载速度慢或出现ReadTimeoutError
原因是默认源在国外。解决方案是使用清华或阿里镜像源。如果下载中途断掉,重新执行一次pip install即可,已下载的缓存不会浪费。
4. 报错ERROR: Could not find a version that satisfies the requirement xxx
先检查包名是否拼写正确。例如要安装OpenCV,包名是opencv-python,不是opencv。也可以到pypi.org搜索确认包名,并确认该包当前版本是否支持你所用的Python版本。
5. 能不能把venv文件夹直接拷贝给别人或另一台电脑
不建议这样做。venv内部记录的路径是写死的,换机器后容易失效,而且venv文件体积大。正确做法是传递代码和requirements.txt,到新机器重建虚拟环境并执行pip install -r requirements.txt。
八、新一代工具uv简介
uv是社区中较新的Python包与环境管理工具,使用Rust编写,下载和安装速度比pip快很多。它的基础用法很容易上手:
pip install uv
uv venv
uv pip install requests
uv pip freeze > requirements.txt
uv默认创建的虚拟环境目录是.venv,激活方式和普通venv一致。日常如果还没熟悉venv和pip,建议继续使用venv/pip,它们是目前教程、公司项目和社区资料中最通用的基础方案。
以上内容覆盖了Python项目依赖隔离、环境迁移和常见安装报错处理。在自己的旧项目上实际操作一遍,比死记命令更容易理解。
Re: Python虚拟环境venv与pip依赖管理使用教程及常见报错
这帖子写得挺实用的,把 venv 和 pip 这套流程梳理得很清楚。我补充一个自己踩过的坑:有时候激活了虚拟环境,但 IDE 里跑脚本用的还是全局解释器,光看终端里有没有 `(venv)` 还不够,一定得去确认编辑器右下角或设置里的解释器路径。另外 `python -m pip` 确实比裸 `pip` 更靠谱,特别是机器上装了好几个 Python 版本的时候。感谢楼主整理了命令行和 PowerShell 的不同激活方式,这个对新手很友好。Re: Python虚拟环境venv与pip依赖管理使用教程及常见报错
楼主这篇教程写得很实在,把 venv 和 pip 从创建到迁移的完整链路都讲清楚了,尤其是指出“装了包但 import 不到”的排查顺序,对新手来说特别友好。我补充一点个人体验:在 Windows 上用 `python -m pip install` 确实比直接用 `pip install` 更稳妥,因为有些机器上 pip 可能是旧版本或者指向别的 Python;另外,如果项目里不同依赖之间有版本冲突,用 `requirements.txt` 固定版本只是第一步,更复杂的情况可以再了解下 pip-tools 或者锁定文件的概念。总之按楼主这条流程走,日常开发基本不会踩坑。Re: Python虚拟环境venv与pip依赖管理使用教程及常见报错
讲得很清楚,尤其是“编辑器不会自动使用venv”这点太真实了,我第一次用VSCode就栽在这上面,包明明装好了还是报ModuleNotFoundError。另外用`python -m pip`而不是直接`pip`那个习惯确实能避免很多装错环境的坑。收藏了,以后迁移项目照着来就行。
页:
[1]