1. 为什么你该在 WSL 里跑 Python,而不是在 Windows 里硬装
我在 Windows 上正经写 Python 的项目,前前后后折腾了三四年。早期用原生 Python + pip 一把梭,项目多了之后就出事——A 项目要 Django 3.2,B 项目要 Django 4.0,升一个另一个就崩;有些依赖带 C 扩展,Windows 下编译报错能报到你怀疑人生。后来换了 Conda,Windows 下也能建虚拟环境了,但 Linux 特有的工具链、系统库还是没法碰,想在本地复现服务器上的部署环境,总有细微差别。
切到 WSL 是最近一年的事。用 WSL 2 + Miniconda 这一套组合拳之后,我基本不在 Windows 侧碰 Python 了。WSL 2 不是虚拟机,它跑在轻量级虚拟化平台上,内部是一个完整的 Linux 内核,所以 Ubuntu 能干的活它都能干。而且它能直接访问 Windows 盘符下的文件(比如 /mnt/c/Users/xxx/project),Windows 侧也能用 \\wsl$\Ubuntu\home\xxx 直接编辑 Linux 内的文件,两边互通非常顺。
这篇文章就把我的环境搭建过程完整拆开,从 WSL 2 的安装到 Conda 国内源配置、再到创建 Python 环境和管理 pip,一步一步带命令走,适合以下几类读者:
- 刚接触 WSL,想在 Windows 上拥有一个纯粹的 Linux 开发环境的新手
- 被 Windows 下 Python 依赖冲突、编译报错折腾到头疼,想切换到 Conda 工作流的人
- 在跑 ComfyUI、Stable Diffusion WebUI 这类要求严格 Python 环境的 AI 工具时,报“节点缺失 / 需要 pip install”之类错误却不知道怎么解决的用户
最后会附上我踩过的坑和排查表,建议收藏备用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先把 WSL 2 折腾到能用的状态
2.1 WSL 安装:三条路线,选方便的那条
WSL(Windows Subsystem for Linux)现在的安装入口很简单,管理员 PowerShell 里跑一句:
powershell复制wsl --install
这句命令会帮你开 Windows 可选功能、下载 WSL 内核,默认装 Ubuntu。但实际执行中我见过太多翻车现场:要么进度条卡在那不动,要么报“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”,要么下载速度慢到像在下载整个银河系。
我自己最常用的方案是分步手动安装,可控性更高:
- 管理员 PowerShell 里启用两个功能:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重启电脑,然后在管理员 PowerShell 执行:
powershell复制wsl --set-default-version 2
-
去 Microsoft Store 搜 Ubuntu 22.04 LTS,点安装。如果 Store 下载也有问题,可以在浏览器打开微软官方的 WSL 发行版下载页,手动下载
.appx安装包,然后解压或者双击安装,速度反而稳定。 -
完成后在开始菜单打开 Ubuntu,第一次启动会让你创建 Linux 用户名和密码。这个用户名不会和 Windows 用户名冲突,可以随便设,但别设太简单的。
安装完先看一眼版本,确认是 V2 而不是 V1:
bash复制wsl -l -v
输出里 NAME 是 Ubuntu、VERSION 是 2,就说明没问题。V1 和 V2 的核心区别是内核完整度:WSL 1 只做系统调用翻译,兼容性差;WSL 2 是真正的 Linux 内核,装原生 Linux 软件基本无坑。
2.2 装机后的第一件事:给 Linux 换内核源并装编译工具
Conda 提供的 Python 包大多是二进制的,但有些包需要编译安装,所以 build-essential 这类工具包一定得提前装上。进入 Ubuntu 终端后,第一件事:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential curl wget git
apt update 从 Ubuntu 官方源拉取索引,国内网络如果慢,就把 /etc/apt/sources.list 里的源换成阿里云或清华源。这一步很多人忽略,结果后面 Conda 装完了,想编译装个什么包却发现 gcc 没有,白白浪费时间。
这里也说一句:WSL 里的 Ubuntu 默认用户不是 root,这是正确的,日常操作就用普通用户,需要管理员权限时加 sudo,别图省事直接 su root,权限隔离对开发环境是保护。
2.3 WSL 卡、内存吃爆?用 .wslconfig 做性能约束
WSL 2 默认配置对内存和 CPU 很贪婪——Windows 有 32GB 内存,WSL 默认能用到 32GB 的 50% 甚至更多。你没感觉还好,一旦在里面跑个 Conda 装包,内存直接飙升,Windows 反过来开始卡。
解决办法是在 C:\Users\你的用户名\.wslconfig 文件里做限制。这个文件默认不存在,自己建一个,内容参考如下:
ini复制[wsl2]
memory=8GB
processors=4
swap=4GB
localhostForwarding=true
保存后,在 PowerShell 执行 wsl --shutdown,然后重新打开 Ubuntu,配置就生效了。localhostForwarding=true 保证 WSL 里启动的 Jupyter Notebook、FastAPI 服务能被 Windows 浏览器通过 localhost 直接访问,默认就是开的,不过显式写出来不容易忘。
如果你遇到“WSL 里能拼通外网,但 Windows 访问不到 WSL 里的端口”这类问题,大概率就是 .wslconfig 配置改动后没重启,或者 Windows 防火墙把端口拦了。先 wsl --shutdown 再重开,八成能解决。
2.4 WSL 整体备份:目录迁移和恢复出厂设置
这块很多人用不上,但要提前知道。Conda 环境 + 安装的包,时间久了能占十几 GB,全部堆在 WSL 的虚拟磁盘文件(ext4.vhdx)里。如果你把 WSL 默认装到了 C 盘,C 盘空间告急时就要做目录迁移。
两条命令搞定导出和重新导入:
powershell复制wsl --shutd
