由于playwright是微软的,为了保证最大的兼容性,用微软使用的操作系统为基础镜像。所以选择使用ubuntu 24.04 LTS, 但是ubuntu 24.04 LTS上是不带python 3.13的,它内置的是python 3.12, 需要自己编译,那太麻烦,于是找一个现成的docker镜像,叫做noble-python这个镜像的3.13版本。
然后常规操作:
更改ubuntu的源为国内的,比如阿里云,注意现在使用source文件,不使用list文件
创建一个虚拟环境
在虚拟环境中安装requirements.txt其中包含playwright。
然后安装playwright需要的浏览器内核
可以通过PLAYWRIGHT_BROWSERS_PATH环境变量指定内核的安装位置,不然会安装到~/.cache下
可以使用代理加速下载,不然会很慢。
可以使用--with-deps和--dry-run看看,它真的会安装一些什么东西。
(venv) root@playwright:/data# https_proxy=http://172.16.8.86:10808 playwright install --with-deps --dry-run
sh -c "apt-get update&& apt-get install -y --no-install-recommends libasound2t64 libatk-bridge2.0-0t64 libatk1.0-0t64 libatspi2.0-0t64 libcairo2 libcups2t64 libdbus-1-3 libdrm2 libgbm1 libglib2.0-0t64 libnspr4 libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 libcairo-gobject2 libfontconfig1 libfreetype6 libgdk-pixbuf-2.0-0 libgtk-3-0t64 libpangocairo-1.0-0 libx11-xcb1 libxcb-shm0 libxcursor1 libxi6 libxrender1 gstreamer1.0-libav gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good libicu74 libatomic1 libenchant-2-2 libepoxy0 libevent-2.1-7t64 libflite1 libgles2 libgstreamer-gl1.0-0 libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libgtk-4-1 libharfbuzz-icu0 libharfbuzz0b libhyphen0 libjpeg-turbo8 liblcms2-2 libmanette-0.2-0 libopus0 libpng16-16t64 libsecret-1-0 libvpx9 libwayland-client0 libwayland-egl1 libwayland-server0 libwebp7 libwebpdemux2 libwoff1 libxml2 libxslt1.1 libx264-164 libavif16 xvfb fonts-noto-color-emoji fonts-unifont xfonts-cyrillic xfonts-scalable fonts-liberation fonts-ipafont-gothic fonts-wqy-zenhei fonts-tlwg-loma-otf fonts-freefont-ttf"
Chrome for Testing 145.0.7632.6 (playwright chromium v1208)
Install location: /data/playwright_browsers/chromium-1208
Download url: https://cdn.playwright.dev/chrome-for-testing-public/145.0.7632.6/linux64/chrome-linux64.zip
Chrome Headless Shell 145.0.7632.6 (playwright chromium-headless-shell v1208)
Install location: /data/playwright_browsers/chromium_headless_shell-1208
Download url: https://cdn.playwright.dev/chrome-for-testing-public/145.0.7632.6/linux64/chrome-headless-shell-linux64.zip
Firefox 146.0.1 (playwright firefox v1509)
Install location: /data/playwright_browsers/firefox-1509
Download url: https://cdn.playwright.dev/dbazure/download/playwright/builds/firefox/1509/firefox-ubuntu-24.04.zipDownload fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/firefox/1509/firefox-ubuntu-24.04.zipDownload fallback 2: https://cdn.playwright.dev/builds/firefox/1509/firefox-ubuntu-24.04.zip
WebKit 26.0 (playwright webkit v2248)
Install location: /data/playwright_browsers/webkit-2248
Download url: https://cdn.playwright.dev/dbazure/download/playwright/builds/webkit/2248/webkit-ubuntu-24.04.zipDownload fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/webkit/2248/webkit-ubuntu-24.04.zipDownload fallback 2: https://cdn.playwright.dev/builds/webkit/2248/webkit-ubuntu-24.04.zip
FFmpeg (playwright ffmpeg v1011)
Install location: /data/playwright_browsers/ffmpeg-1011
Download url: https://cdn.playwright.dev/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-linux.zipDownload fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-linux.zipDownload fallback 2: https://cdn.playwright.dev/builds/ffmpeg/1011/ffmpeg-linux.zip
然后去掉--dry-run进行真实安装,安装完成后,可以再跑一次安装以确认安装确实成功了。因为已经安装过,它会自动检查并跳过。
真正符合工程实践的 pip / venv 依赖管理 Best Practice v2(已修正 lock 概念 + pip-tools 崩溃问题)。
🧱 1️⃣ 虚拟环境(基础但决定稳定性)
python3 -m venv venv
source venv/bin/activate
pip install -U pip setuptools wheel
Bash
原则 | 原因 |
|---|
永远使用 venv | 防止系统包污染 |
先升级 pip / setuptools / wheel | 避免旧构建系统导致编译失败 |
⚠️ 2️⃣ pip 与 pip-tools 版本兼容性(新坑)
你遇到的错误本质:
AttributeError: 'PackageFinder' object has no attribute 'allow_all_prereleases'
Plain Text
组件 | 问题 |
|---|
pip ≥ 25.3 | 重构内部 API |
pip-tools 旧版本 | 依赖 pip 私有 API → 崩溃 |
✅ 生产可用修复
pip install "pip<25.3"
pip install -U pip-tools
Bash
👉 pip-tools 不是独立工具,它强依赖 pip 内部结构
👉 这是 Python 依赖生态的“隐藏地雷”
📦 3️⃣ 正确的依赖分层(非常重要)
你关注的顶层依赖:
FastAPI
Uvicorn[standard]
Playwright
Plain Text
我们要分成 两类文件:
文件 | 作用 | 是否手写 |
|---|
requirements.in | 顶层依赖声明 | ✅ |
requirements.lock | 完整可复现锁文件 | ❌ 自动生成 |
✍️ 4️⃣ 正确流程(标准工业做法)
Step 1 — 写顶层依赖
echo -e "fastapi\nuvicorn[standard]\nplaywright" > requirements.in
Bash
Step 2 — 编译锁文件(真正的 lock)
pip-compile --generate-hashes -o requirements.lock requirements.in
Bash
生成内容特点:
特性 | 说明 |
|---|
固定所有子依赖版本 | 不再漂移 |
带 SHA256 哈希 | 防供应链攻击 |
100% 可复现 | CI / Docker 稳定 |
🚫 为什么 pip freeze ≠ lock 文件
pip freeze | pip-compile |
|---|
记录“当前环境状态” | 计算“依赖闭包” |
可能带入临时调试包 | 只保留依赖树 |
不安全(无哈希) | 安全(哈希校验) |
不适合团队协作 | 生产标准 |
✔ 所以你说得对:
pip freeze 应该输出 requirements.txt,而不是 lock 文件
🚀 5️⃣ 安装依赖(部署 / 服务器)
pip install --require-hashes -r requirements.lock
Bash
这会:
🔍 6️⃣ 冲突检测(CI 必做)
pip check
pip install pipdeptree
pipdeptree --warn fail
Bash
⛔ 7️⃣ 升级策略(避免你刚才的 starlette 冲突)
错误做法 | 正确做法 |
|---|
pip install -U starlette | ❌ |
修改 requirements.in 后重新 compile | ✅ |
升级流程:
vim requirements.in # 改顶层版本
pip-compile --upgrade
Bash
🧨 8️⃣ 环境炸了最快恢复法
rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.lock
Bash
比排查冲突快得多。
🧠 9️⃣ Playwright 特别提示(你的栈里有它)
Playwright 不是纯 Python 依赖,还依赖浏览器系统库:
playwright install --with-deps
Bash
建议写进 Dockerfile,而不是运行时执行。
🧭 🔥 最终黄金规则(工程级)
规则 | 重要度 |
|---|
只手写 requirements.in | ⭐⭐⭐⭐⭐ |
永远用 pip-compile 生成 lock | ⭐⭐⭐⭐⭐ |
禁止 pip freeze 作为 lock | ⭐⭐⭐⭐ |
升级只改顶层依赖 | ⭐⭐⭐⭐⭐ |
CI 必跑 pip check | ⭐⭐⭐⭐ |
固定 pip 版本以兼容 pip-tools | ⭐⭐⭐⭐ |
🎯 一句话总结
pip 是安装工具,pip-tools 才是依赖管理工具
稳定性的核心:
顶层声明 + 锁文件 + 哈希校验 + 可重建