教程:将 Python Playwright 脚本打包为独立 Windows EXE (含浏览器内核)

教程:将 Python Playwright 脚本打包为独立 Windows EXE (含浏览器内核)

在开发自动化工具或定制化浏览器时,我们经常使用 Python 的 Playwright 库。但如果要将工具分发给非技术用户,要求对方安装 Python 环境、下载对应版本的浏览器内核是非常痛苦的。

本文介绍一种方案:将 Python 代码、Playwright 依赖库以及 Chromium 浏览器内核全部打包进一个独立的 .exe 文件中,实现真正的“零依赖”运行。

核心挑战

Playwright 默认将浏览器二进制文件下载到用户目录(如 %AppData%)。在打包时,我们需要解决两个核心问题:

  1. 构建时包含:如何把浏览器文件“塞”进 exe 里?
  2. 运行时定位:打包后的程序运行在临时目录,如何告诉 Playwright 去哪里找浏览器?

解决方案

1. Python 代码适配 (test-01.py)

我们需要在代码中动态检测当前是否在 PyInstaller 的打包环境中运行。如果是,则将环境变量 PLAYWRIGHT_BROWSERS_PATH 指向解压后的临时目录(sys._MEIPASS)。

此外,为了更好的用户体验,我们增加了错误捕获:如果程序崩溃(特别是在无控制台模式下),会弹出 Windows 错误对话框,而不是直接静默退出。

import argparse import os from pathlib import Path import sys import time import traceback from playwright.sync_api import sync_playwright SUPPORTED_DEFAULT_DEVICE ="Pixel 5"defresolve_browser_root()-> Path |None:""" 核心逻辑:定位浏览器路径 1. 如果是打包环境,资源位于 sys._MEIPASS 下的 ms-playwright 目录 2. 如果是开发环境,可能在环境变量指定位置、当前目录或系统默认目录 """ candidates =[]# PyInstaller 解压临时目录ifhasattr(sys,"_MEIPASS"): candidates.append(Path(sys._MEIPASS)/"ms-playwright")# 手动环境变量if os.environ.get("PLAYWRIGHT_BROWSERS_PATH"): candidates.append(Path(os.environ["PLAYWRIGHT_BROWSERS_PATH"]))# 当前目录或默认目录 candidates.append(Path.cwd()/"ms-playwright") candidates.append(Path.home()/"AppData"/"Local"/"ms-playwright")for c in candidates:if c.exists():return c returnNonedefparse_args()-> argparse.Namespace: parser = argparse.ArgumentParser( description="Launch Chromium in mobile emulation mode.") parser.add_argument("--url", default="https://doris.apache.org",help="Page to open.") parser.add_argument("--device", default=SUPPORTED_DEFAULT_DEVICE,help="Device profile name.") parser.add_argument("--headless", action="store_true",help="Run in headless mode.") parser.add_argument("--timeout",type=int, default=0,help="Auto-close timeout.")return parser.parse_args()deflaunch_mobile(url:str, device_name:str, headless:bool, timeout:int)->None:# 动态设置浏览器路径 browser_root = resolve_browser_root()if browser_root: os.environ["PLAYWRIGHT_BROWSERS_PATH"]=str(browser_root)with sync_playwright()as p: devices = p.devices if device_name notin devices:print(f"Unknown device: {device_name}") sys.exit(1) browser = p.chromium.launch(headless=headless)# 忽略 HTTPS 证书错误,确保内网或测试环境可用 context = browser.new_context(ignore_https_errors=True,**devices[device_name]) page = context.new_page() page.goto(url)print(f"Opened {url} in mobile mode: {device_name}")if browser_root:print(f"Using bundled browsers at: {browser_root}")# 保持运行try:if timeout >0: time.sleep(timeout)else:whileTrue: time.sleep(1)except KeyboardInterrupt:passfinally: browser.close()defmain():try: args = parse_args() launch_mobile(args.url, args.device, args.headless, args.timeout)except Exception:# 错误处理:如果是打包环境(无控制台),弹窗提示错误ifgetattr(sys,'frozen',False):import ctypes ctypes.windll.user32.MessageBoxW(0,f"Error: {traceback.format_exc()}","Application Error",0x10)else: traceback.print_exc() sys.exit(1)if __name__ =="__main__": main()

2. 自动化构建脚本 (build_exe.ps1)

为了简化构建流程,我们编写一个 PowerShell 脚本。它的作用是:

  1. 局部下载:将 Chromium 下载到当前项目的临时文件夹 ms-playwright-local,防止污染全局环境。
  2. 资源映射:在调用 PyInstaller 时,使用 --add-data 参数,将下载好的 ms-playwright-local 映射打包到 EXE 内部的 ms-playwright 路径。
# build_exe.ps1# 1. 确保安装依赖Write-Host"Installing Python dependencies..." pip install playwright pyinstaller # 2. 设置本地下载路径,避免影响系统全局配置$localBrowserPath = Join-Path(Get-Location)"ms-playwright-local"$env:PLAYWRIGHT_BROWSERS_PATH = $localBrowserPath# 3. 下载 Chromium 到本地文件夹Write-Host"Downloading Chromium to $localBrowserPath..."if(Test-Path$localBrowserPath){Remove-Item-Recurse -Force $localBrowserPath}# 这里会自动下载 Chromium python -m playwright install chromium # 4. 执行 PyInstaller 打包Write-Host"Building EXE..."# 关键参数解释:# --windowed: 隐藏控制台窗口(适合 GUI 程序)# --collect-all playwright: 自动收集 Playwright 的库文件# --add-data "源路径;目标路径": 将浏览器文件夹打入包内 pyinstaller --noconfirm --onefile --windowed --name mobile_chromium ` --collect-all playwright ` --add-data"$localBrowserPath;ms-playwright" ` src02/test-01.py Write-Host"Build complete! Output: dist/mobile_chromium.exe"

如何使用

构建

在项目根目录下,打开 PowerShell 运行:

.\src02\build_exe.ps1 

分发与运行

构建完成后,dist 文件夹下的 mobile_chromium.exe 就是我们需要的文件。你可以将其拷贝到任何 Windows 电脑上运行。

基本用法: 直接双击运行。

高级用法(命令行):

# 指定打开百度,模拟 iPhone 13.\mobile_chromium.exe --url https://www.baidu.com --device "iPhone 13"

最终效果:

在这里插入图片描述

exe文件大小:

在这里插入图片描述

总结

通过这种方式,我们成功将一个复杂的浏览器自动化环境(Python + Playwright + Chromium Binary)压缩成了一个数百MB的单文件 EXE,极大地降低了工具的分发和部署成本。

Read more

告别塑料感!阿里Qwen-Image-2512用真实质感重新定义AI绘画

告别塑料感!阿里Qwen-Image-2512用真实质感重新定义AI绘画

2025年12月31日,当多数人在准备跨年时,阿里通义千问团队突然开源了Qwen-Image-2512这款图像生成模型。它号称要干掉“AI味”,生成的照片比真人拍的还真实。我抱着“真的假的”的心态试用了几天,结论是:它对新手极其友好,且效果突出。 01 模型进化,让AI绘画告别“塑料感”时代 AI绘画一直有个难以摆脱的标签——“AI味”,那种过于完美却不真实的质感,让作品总显得有点“塑料感”。 Qwen-Image-2512针对这一痛点进行了升级更新,让生图效果更细腻、也更真实。 人物肌肤质感方面,新模型能够生成真实毛孔纹理与细微光影变化,发丝根根分明,眼神生动自然。 在自然纹理还原上,无论是风景构图中的水流、树木,还是动物毛发,都呈现出惊人的细腻度。 复杂文字渲染是Qwen-Image系列的强项,而2512版本进一步提升了文字渲染质量与排版准确性,图文混合渲染更加精准。 在AI Arena平台进行的超过1万局模型盲测中,Qwen-Image-2512被评为当前最强开源图像生成模型,甚至在某些方面可与闭源商业模型一较高下。 02 零门槛入门,两种方式快速上手 对于

By Ne0inhk
降本 100%!告别无限的 token 消耗 !OpenClaw (龙虾) 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗

降本 100%!告别无限的 token 消耗 !OpenClaw (龙虾) 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗

摘要 OpenClaw(社区昵称 “大龙虾”)作为 2026 年最火的 AI Agent 框架,凭借强大的自动化执行能力成为开发者标配。但随着使用频次提升,云端大模型 Token 消耗成本居高不下,成为个人开发者与中小企业的核心痛点。本文针对最新版 OpenClaw 2026.2.26,提供一套零成本、可复现的本地化解决方案:通过 Ollama 部署开源大模型,彻底摆脱云端依赖,解决命令行参数失效、认证配置错误等核心问题,实现 “本地推理 + 本地执行” 的全闭环,兼顾成本、隐私与性能。 关键词:OpenClaw;Ollama;本地部署;开源模型;Token 降本;AI Agent;2026.2.26 一、痛点直击:为什么你的

By Ne0inhk
Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断技术债堆砌 前言 在 OpenHarmony 的大规模团队协作中,代码质量是团队的生命线。如果没有有效的约束,不符合规范的代码(甚至是无法通过静态分析的代码)会轻易地通过 git commit 进入代码库,导致 CI 构建频繁失败。git_hooks 库为 Flutter 开发者提供了一种轻量级的脚本化方案,可以在 Git 的关键生命周期(如提交前、推送前)自动运行检查。本文将带大家在鸿蒙端实战适配该库,夯实自动化工程的地基。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 git_hooks 的核心逻辑是基于 Git

By Ne0inhk
飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程

飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程

飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程 * 一、背景 * 二、实现方案概览 * 三、操作步骤 * 前置准备 * 第一步:创建并进入Claude Code容器 * 配置Claude Code使用本地模型 * 测试Claude Code是否正常工作 * 第二步:安装Python依赖 * 第三步:获取飞书应用的凭证 * 第四步:编写并运行中间件脚本 * 脚本解释 * 运行脚本 * 第五步:在飞书中与机器人对话 * 常见问题 * 总结 一、背景 在日常开发中,我们经常需要快速查询代码问题、生成文档或执行简单的编程任务。如果有一款AI助手能随时响应,就像在电脑终端前一样,那该多方便!本教程将演示如何搭建一个飞书机器人,当你在手机飞书App上发送消息时,该消息会传递给运行在电脑上的Claude Code(一个智能编码助手),Claude Code处理后将结果回复到你的飞书会话中。 通过这个方案,你可以: * 在手机上随时向AI提问编程问题。 * 让AI帮你调试

By Ne0inhk