Python 虚拟环境:别再把项目搞成一锅粥了
我是陈默,一个正拼命上岸的码农。
你有没有遇到过这种情况——
项目 A 需要 Django 3.2,项目 B 需要 Django 4.1。你装完这个,那个就崩了。改完那个,这个又炸了。
然后你花了一整个下午在 Stack Overflow 上找答案,最后只能无奈地重装 Python。
这不是你的错。是因为你少学了一个东西——虚拟环境。
1. 为什么需要虚拟环境?
想象一下你的电脑是一个大仓库。
你所有的 Python 包都往里面扔。Flask、Django、Requests、NumPy……全都堆在一起。
时间一长,你会遇到三个问题:
第一,版本冲突。 项目 A 要 requests 2.25,项目 B 要 requests 2.28。你只能留一个,另一个就得哭。
第二,依赖混乱。 你根本不知道哪个项目用了哪个包。删又不敢删,装又不敢装。
第三,部署困难。 你本地跑得好好的,上了服务器就报错。因为服务器上的包版本跟你本地不一样。
虚拟环境就是给每个项目建一个独立的小仓库。互不干扰,各管各的。
这是 Python 工程化的第一步。也是最重要的一步。
2. 用 venv 创建你的第一个虚拟环境
Python 3.3 以后,标准库自带了 venv 模块。不用装任何额外的东西。
打开终端,进入你的项目目录,然后执行:
python3 -m venv myenv
就这一行命令,你的虚拟环境就创建好了。
myenv 是虚拟环境的名字,你可以随便取。常见的有 venv、env、.venv。
创建完之后,你的项目目录里会多一个 myenv 文件夹。这里面就是你的独立 Python 环境。
但注意——光创建还不够。
你需要激活它。
macOS / Linux:
source myenv/bin/activate
Windows:
myenv\Scripts\activate
激活之后,你会看到终端提示符前面多了一个 (myenv)。这就说明你已经在虚拟环境里了。
现在你用 pip install 装的任何包,都只在这个虚拟环境里。不会污染系统的 Python。
用完了,想退出?一行命令:
deactivate
就这么简单。
3. 虚拟环境的日常操作
创建和激活只是开始。日常开发中,你还需要掌握几个关键操作。
安装依赖。
激活虚拟环境后,正常使用 pip 就行:
pip install flaskpip install requests==2.28.0
这些包只会安装在当前虚拟环境里。
导出依赖列表。
项目写完了,要给别人用。你怎么告诉对方需要装哪些包?
pip freeze > requirements.txt
这个命令会把当前环境里所有包和版本号写入 requirements.txt 文件。
对方拿到项目后,一条命令就能装好所有依赖:
pip install -r requirements.txt
这是团队协作的基本操作。
删除虚拟环境。
不需要了?直接删掉文件夹就行:
rm -rf myenv
不会影响系统 Python,也不会影响其他项目的虚拟环境。干净利落。
一个建议—— 把虚拟环境文件夹加入 .gitignore。你不需要把环境本身提交到代码仓库,只需要提交 requirements.txt。
4. 几个常见的坑
新手用虚拟环境,总会踩几个坑。我帮你提前避一避。
坑一:忘了激活虚拟环境就装包。
你兴致勃勃地 pip install flask,装完发现项目还是找不到 Flask。
因为你没激活虚拟环境,包装到了系统 Python 里。
解决办法:装包之前,先看一眼终端提示符有没有 (myenv)。养成习惯。
坑二:虚拟环境路径里带中文或空格。
Windows 用户特别容易中招。项目放在"我的文档"或者桌面,路径里有空格和中文。虚拟环境创建可能失败,或者激活后各种报错。
解决办法:项目路径只用英文,不要有空格。
坑三:IDE 没有配置虚拟环境。
你在终端激活了虚拟环境,但 VS Code 或 PyCharm 还在用系统 Python。运行代码的时候各种找不到包。
解决办法:在 IDE 里手动选择虚拟环境的 Python 解释器。
VS Code 里按 Cmd+Shift+P,输入 "Python: Select Interpreter",选择你虚拟环境里的 Python。
最后
虚拟环境不是什么高级技术。它是 Python 开发的底线操作。
就像做饭之前先洗手一样——不是可选项,是基本功。
回顾一下今天的内容:
- 用
python3 -m venv myenv 创建,source 激活,deactivate 退出 - 用
pip freeze 导出依赖,pip install -r 安装依赖
去动手创建一个虚拟环境吧。五分钟的事,但会让你省下无数个被依赖问题折磨的下午。
今天就到这里。
我是陈默,我们下期再见。
如果你觉得这篇文章有帮助,欢迎关注我。我会持续分享 Python 学习的干货。