news 2026/10/26 13:25:31

Selenium 驱动 Firefox:geckodriver 安装配置与排错

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Selenium 驱动 Firefox:geckodriver 安装配置与排错

简介:面向Python初学者及需要开展Firefox自动化测试的开发者,压缩包提供可运行的Python环境文件与Geckodriver驱动,可用于Selenium脚本调试、网页自动化与爬虫验证的环境搭建。包内共880个文件,约11.82MB,以py源码和pyc缓存为主,并含dll、pyd、exe等运行依赖,以及txt、xml、json等配置说明;目录中可见python36.dll、tcl/tk组件与虚拟环境激活脚本,便于还原可执行环境。已有1382人学习下载,说明其对环境配置与驱动联调具有参考价值。读者可配合PyCharm进行脚本编写、调试和项目管理,理解webdriver.Firefox调用、驱动路径配置及Selenium与Firefox通信流程,减少环境搭建和驱动匹配中的摸索成本。

1. 从一台能跑和一台跑不起来的机器说起:Python 调 geckodriver 的安装边界

Python 脚本里一行webdriver.Firefox(),在 A 机器上跑得顺,拷到 B 机器就报'geckodriver' executable needs to be in PATH。这类事我碰过太多次:requirements.txt装得干干净净,selenium 版本也对得上,唯独 geckodriver 这个几十兆的单文件没有出现在正确的路径上。它不属于 pip 生态,不会随pip install selenium一起进来,必须单独下载、单独放路径、单独给执行权限。

装不好时的症状还特别分散——有时是驱动找不到,有时是浏览器版本对不上,有时是执行权限被系统拦下,看起来都像 Python 代码写错了,排查方向一偏就是半天。这套环境适合需要让 Python 稳定驱动 Firefox 做自动化回归、页面采集或前端截图的人,尤其是要在多台机器、多个系统上复现同一份脚本的场景。下面按我实际装机的顺序,从定版本、放驱动、写配置一路记到出错怎么救。

2. 装前定版:Python、Firefox、geckodriver 三者的版本账

装 geckodriver 最容易翻车的地方不在安装动作本身,而在装之前的版本选择。Python 解释器、Firefox 浏览器、geckodriver 驱动这三者任意一个版本错位,脚本都会在启动浏览器那一步失败,而报错信息又各不相同。我的习惯是先把三者各自定下来,再动手下载,后面能省掉大量来回试的时间。

2.1 先隔离 Python 解释器,再谈装驱动

不要在系统自带的 Python 上直接装 selenium。系统解释器往往被包管理器管着,升级 pip 可能影响其他工具,装坏了也不容易回退。常见做法是给这类浏览器自动化项目单独建一个虚拟环境,目录名带上用途,后面一看就知道是干什么的。

# 建一个只给 Firefox 自动化用的虚拟环境 python -m venv venv-gecko # Linux / macOS 激活 source venv-gecko/bin/activate # Windows PowerShell 激活 # .\venv-gecko\Scripts\Activate.ps1 # 升级 pip 并锁定 selenium 大版本 python -m pip install --upgrade pip pip install "selenium>=4.10,<5"

python -m venv会在当前目录生成一个独立解释器,激活后pip装的包只落在venv-gecko里,不污染全局。selenium>=4.10,<5这个写法把大版本锁在 4.x,避免哪天 5.x 发布后 API 变动导致脚本直接跑不起来。近两年的 Selenium 4.x 对 Python 最低版本的要求基本抬到了 3.9 以上,我一般用 3.10 或 3.11,太老的 3.7、3.8 在新版 Selenium 上会直接装不上。

装完先确认版本,别急着写脚本:

python -c "import selenium; print(selenium.__version__)"

输出类似4.21.0就说明装好了。如果这里报ModuleNotFoundError,多半是虚拟环境没激活,或者 pip 装到了别的解释器里,用which python(Windows 用where python)确认当前用的是不是venv-gecko里那个。

提示:虚拟环境目录不要提交到代码仓库,.gitignore里加一行venv-gecko/,否则换机器时路径全乱。

2.2 Firefox 与 geckodriver 的版本对应,别拿新驱动配老浏览器

geckodriver 是 Firefox 对 W3C WebDriver 协议的实现,Python 通过它远程控制浏览器。它和 Firefox 之间有版本门槛:驱动太新,老浏览器会被拒绝;驱动太老,新浏览器的一些能力又用不上。判断当前 Firefox 版本最直接的办法是命令行查:

# Linux / macOS firefox --version # Windows PowerShell (Get-Item "C:\Program Files\Mozilla Firefox\firefox.exe").VersionInfo.ProductVersion

拿到版本号之后对照下面这张表。表里的区间是社区里长期验证过的组合,具体以驱动发布页的 release 说明为准,但大方向不会错:

Firefox 版本可用的 geckodriver 区间适用场景
115 ESR / 128 ESR 及以上0.33.x、0.34.x主流稳定组合,推荐
102 ESR ~ 1140.31.x ~ 0.33.x老 ESR 环境仍可跑
91 ~ 1010.30.x ~ 0.32.x新驱动会直接拒绝启动
78 ~ 900.27.x ~ 0.30.x只在遗留系统里遇到

我一般把 Firefox 保持在 ESR 或最新稳定版,geckodriver 用发布页上的最新稳定版,这样两边都在支持期内。如果机器上装的是绿色版或解压版 Firefox,没有走系统安装流程,后面还得额外用binary_location指路,这一点在配置章节会展开。

从 Selenium 4.6 开始,框架内置了 Selenium Manager,理论上可以自动探测并下载匹配的驱动。听起来省事,但它在离线机器、内网机器和代理受限的环境里失败率不低,报错还比较隐晦。我的做法是仍然手动装一份 geckodriver,把路径写死,把自动管理当成兜底而不是主路径。

2.3 三平台下载、解压与校验

geckodriver 发布页提供各平台的压缩包,命名规律很固定:Windows 是geckodriver-v0.34.0-win64.zip,Linux 是geckodriver-v0.34.0-linux64.tar.gz,macOS 分 Intel 的macos.tar.gz和 Apple Silicon 的macos-aarch64.tar.gz。下载时看清楚架构,Apple Silicon 机器装了 Intel 包,运行时会报架构不兼容。

解压之后就是一个单文件,Windows 下叫geckodriver.exe,Linux 和 macOS 下叫geckodriver。先在本目录里跑一次版本命令,确认文件完整:

# Linux x86_64 tar -xzf geckodriver-v0.34.0-linux64.tar.gz chmod +x geckodriver ./geckodriver --version # macOS Apple Silicon tar -xzf geckodriver-v0.34.0-macos-aarch64.tar.gz chmod +x geckodriver xattr -d com.apple.quarantine geckodriver 2>/dev/null || true ./geckodriver --version

chmod +x给文件加执行权限,少了这一步后面 Python 调用时会报Permission denied。macOS 的xattr -d com.apple.quarantine是去掉下载隔离属性,从浏览器下载的二进制文件默认带这个标记,不去掉的话系统可能直接拦截执行,报错信息还看不出原因。--version能打印出版本号和构建信息,说明文件本身没坏,接下来只是把它放到系统能找到的位置。

3. 把 geckodriver 放进 PATH:Windows、macOS、Linux 三条路径

驱动文件校验通过之后,下一步是让 Python 启动 Firefox 时能找到它。Selenium 查找驱动的方式是走系统 PATH,所以核心动作就是把 geckodriver 所在目录加进 PATH。三个系统的做法差别不小,Windows 上还涉及用户级和系统级环境变量的区别,这一章按平台拆开写。

3.1 Windows:exe 放哪、PATH 怎么加、为什么 cmd 和 PowerShell 结果不一样

Windows 上我习惯建一个专门的驱动目录,比如C:\WebDriver\bin,把geckodriver.exe放进去。不要塞进C:\Windows\System32,那个目录混进第三方文件以后很难清理。目录建好后用 PowerShell 把路径追加到当前用户的 PATH:

# 把驱动目录追加到当前用户的 PATH,不动系统级配置 $driverDir = "C:\WebDriver\bin" $oldPath = [Environment]::GetEnvironmentVariable("Path", "User") if ($oldPath -notlike "*$driverDir*") { [Environment]::SetEnvironmentVariable("Path", "$oldPath;$driverDir", "User") } # 新开一个终端后验证 where.exe geckodriver geckodriver --version

这里用"User"作用域,只影响当前登录账户,不需要管理员权限,也不会影响其他用户。if判断是为了防止重复运行脚本时把同一个路径加进去多次。设置完成后必须新开一个终端,已经打开的 cmd 或 PowerShell 不会自动刷新环境变量,这是最常见的“明明加了 PATH 还是找不到”的原因。

where.exe geckodriver能打印出完整路径就说明 PATH 生效了。PowerShell 里直接敲where可能被别名拦截,所以带上.exe后缀更稳。另外注意下载包的位数:64 位系统装了 32 位驱动,或者文件在下载过程中损坏,运行时会报[WinError 216] 此版本的 %1 与您运行的 Windows 版本不兼容,这时候换包重下比继续排查环境更快。

3.2 macOS 与 Linux:/usr/local/bin、chmod 和 quarantine 属性

macOS 和 Linux 上最省事的做法是把驱动放进/usr/local/bin,这个目录默认就在 PATH 里:

# 放进系统 PATH 目录并给执行权限 sudo mv geckodriver /usr/local/bin/geckodriver sudo chmod 755 /usr/local/bin/geckodriver # 验证 which geckodriver geckodriver --version

chmod 755表示所有者可读写执行、其他用户可读可执行,足够 Python 进程调用。有些精简版 Linux 发行版的 PATH 里不包含/usr/local/bin,先用echo $PATH确认一下,没有的话在~/.bashrc或~/.zshrc里补一行export PATH=$PATH:/usr/local/bin,再source一下。

macOS 除了权限,还要留意隔离属性。从浏览器下载的压缩包解压出来的二进制,可能带着com.apple.quarantine标记,系统会拦下执行。用xattr -l /usr/local/bin/geckodriver可以查看属性,用xattr -d com.apple.quarantine /usr/local/bin/geckodriver清掉。这一步不做,报错往往只显示进程启动失败,看不出是隔离属性导致的,属于典型的黑匣子问题。

注意:不要图省事用sudo python script.py来绕权限。用 root 跑 Python 会让生成的临时文件、浏览器 profile 全部带 root 属主,后面普通用户再跑就各种读写失败。

3.3 不改 PATH 的写法:在 Python 里用 Service 指定绝对路径

如果机器上不允许改系统环境变量,或者同一个项目要带多个版本的驱动,可以把驱动放在项目目录里,通过 Selenium 的Service对象直接指定绝对路径,完全不依赖 PATH:

from selenium import webdriver from selenium.webdriver.firefox.service import Service # 用绝对路径指定驱动,不依赖系统 PATH service = Service(executable_path=r"C:\WebDriver\bin\geckodriver.exe") driver = webdriver.Firefox(service=service) driver.get("https://example.com") print(driver.title) driver.quit()

executable_path接受字符串路径,Windows 下用r"..."原始字符串避免反斜杠转义。这种写法的好处是项目自包含:把drivers/目录和代码一起打包,换机器只要路径结构一致就能跑。坏处是路径写死在代码里,换平台要改,所以更适合配合pathlib做相对路径拼接,具体在下一章的最小项目里演示。

4. Selenium 4 的配置写法:从 executable_path 到 Service 对象

驱动放好只是第一步,Python 这边的配置写法也在版本演进中变过。老教程里大量出现的webdriver.Firefox(executable_path=...)在 Selenium 4.x 里已经标记为废弃,继续用会出现告警甚至在未来版本里失效。这一章把新旧写法、常用参数和一个能直接复现的最小项目讲清楚。

4.1 新旧写法对照:为什么 executable_path 会报 deprecation

Selenium 3 时代,驱动路径是作为webdriver.Firefox()的关键字参数传进去的。Selenium 4 把驱动启动逻辑抽成了独立的Service类,路径归Service管,浏览器行为归Options管,职责分开:

# 旧写法:Selenium 4.x 下会告警,未来版本可能移除 # driver = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver") # 新写法:路径交给 Service,行为交给 Options from selenium import webdriver from selenium.webdriver.firefox.service import Service service = Service(executable_path="/usr/local/bin/geckodriver") driver = webdriver.Firefox(service=service)

这个变化不只是 API 位置调整。Service还能配置日志输出路径、启动超时等参数,比如Service(executable_path=..., log_output="gecko.log")可以把驱动自身的日志落到文件里,排查启动失败时比看 Python 的异常栈更有用。Options则负责无头模式、窗口尺寸、profile 目录这些浏览器侧的行为。

如果你的项目还要兼容 Selenium 3,可以用版本判断写分支,但更推荐的做法是把 Selenium 锁在 4.x,统一用新写法,省掉兼容代码。旧写法在 4.x 上目前还能跑,只是每次启动都刷一条DeprecationWarning,日志一多容易把真正的错误淹掉。

4.2 Firefox Options:headless、profile、binary_location 三个常用参数

Options是配置浏览器行为的地方。我日常用得最多的是三个参数:无头模式、浏览器二进制路径、profile 目录。无头模式适合服务器和 CI 环境,没有图形界面也能跑;binary_location解决绿色版 Firefox 找不到的问题;profile 目录则用来复用登录态和浏览器配置。

from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.service import Service options = Options() options.add_argument("-headless") # 无界面模式,服务器上必开 options.add_argument("--width=1280") # 配合无头模式固定视口宽度 options.add_argument("--height=800") options.binary_location = r"C:\Program Files\Mozilla Firefox\firefox.exe" service = Service(executable_path=r"C:\WebDriver\bin\geckodriver.exe") driver = webdriver.Firefox(service=service, options=options) driver.get("https://example.com") print(driver.title) driver.quit()

-headless是 Firefox 的无头参数,注意是一个短横线,和某些其他浏览器的写法不同。--width、--height只在无头模式下生效,用来固定视口,截图和元素定位都依赖这个尺寸。binary_location指向firefox.exe或firefox可执行文件,装在默认路径的机器上可以不写,装在自定义路径或解压版上则必须写,否则驱动会报找不到浏览器二进制。

profile 的写法稍微特殊,可以直接给目录:

from selenium.webdriver.firefox.options import Options options = Options() # 指向一个已存在的 Firefox profile 目录,复用登录态和扩展 options.profile = "/home/user/.mozilla/firefox/abcd1234.default-release"

profile 目录里存着 cookie、历史记录和扩展配置。复用 profile 能省掉每次登录的步骤,但要注意同一个 profile 不能被两个 Firefox 实例同时打开,并发跑脚本时得给每个实例复制一份独立的 profile 目录,否则会报 profile 被占用。

4.3 一个能复现的最小项目和目录结构

把前面的内容拼起来,一个自包含的项目目录大概长这样:

firefox-demo/ ├── venv-gecko/ # 虚拟环境,不提交 ├── drivers/ │ └── geckodriver.exe # 驱动放项目内,路径可移植 ├── run_firefox.py └── requirements.txt

run_firefox.py用pathlib拼相对路径,避免写死绝对路径:

from pathlib import Path from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.service import Service # 以脚本所在目录为基准拼驱动路径,换机器只要目录结构一致就能跑 BASE_DIR = Path(__file__).resolve().parent driver_path = BASE_DIR / "drivers" / "geckodriver.exe" options = Options() options.add_argument("-headless") service = Service(executable_path=str(driver_path)) with webdriver.Firefox(service=service, options=options) as driver: driver.get("https://example.com") print("页面标题:", driver.title)

Path(__file__).resolve().parent拿到脚本所在目录的绝对路径,再往下拼drivers/geckodriver.exe,这样不管从哪个目录执行脚本,路径都不会错。with语句保证脚本异常退出时也会调用driver.quit(),不留孤儿浏览器进程,这一点在 CI 里尤其重要,残留进程会把后续任务卡死。requirements.txt里只写一行selenium>=4.10,<5,驱动文件单独放,不进 pip 依赖。

5. geckodriver 排查:五条从报错反推配置的踩坑记录

geckodriver 的报错信息大多来自驱动进程本身,Python 只是把它的输出转成异常,所以看懂原始信息比在代码里加打印更有效。下面五条是我这几年反复遇到的,按“现象 → 原因 → 解决”记下来,下次遇到同类报错可以直接对号入座。

5.1 找不到驱动和版本不匹配怎么区分

踩坑一:WebDriverException: Message: 'geckodriver' executable needs to be in PATH

现象是脚本一启动就抛异常,浏览器根本没被拉起。原因通常有三种:驱动没放进 PATH;驱动文件名被改过,比如解压后叫geckodriver-v0.34.0而没重命名成geckodriver;PATH 改了但当前终端没重开。解决顺序是先where.exe geckodriver或which geckodriver确认系统能不能找到,找不到就检查文件名和 PATH,能找到但仍报错就检查 Python 进程继承的环境变量,必要时直接用Service(executable_path=...)绕开 PATH。

踩坑二:SessionNotCreatedException: Message: session not created: This version of geckodriver only supports Firefox >= 102

现象是驱动能启动,但一到创建会话就失败,报错里明确写了版本门槛。原因是 Firefox 版本低于驱动要求的最低版本,或者反过来驱动太老配了太新的浏览器。解决是把firefox --version和geckodriver --version两个输出放在一起对照第 2 章那张表,升浏览器或换驱动,二选一。老系统上升不了浏览器,就只能退回对应区间的旧驱动,别硬扛。

5.2 浏览器起不来:权限、root 与二进制定位

踩坑三:PermissionError: [Errno 13] Permission denied

现象是 Python 调用驱动时直接报权限错误。原因是 Linux 或 macOS 上驱动文件没有执行权限,或者 macOS 的隔离属性没清。解决是chmod 755补执行权限,macOS 再补一条xattr -d com.apple.quarantine。还有一种容易忽略的情况:驱动放在挂载的 Windows 分区或网络盘上,文件系统本身不支持执行权限,换到本地磁盘就好。

踩坑四:Message: invalid argument: can't kill an exited process,浏览器进程秒退

现象是驱动启动后 Firefox 立刻退出,日志里留下一句看不出所以然的can't kill an exited process。原因是 Linux 下用 root 用户跑 Firefox,浏览器检测到高权限用户会拒绝启动。解决是建一个普通用户来跑脚本,容器环境里在 Dockerfile 里显式useradd并切换用户,不要图省事用 root。这个坑在容器里特别常见,因为很多基础镜像默认就是 root。

踩坑五:Message: Expected browser binary location, but unable to find binary in default location

现象是驱动找不到浏览器,但机器上明明装了 Firefox。原因是 Firefox 装在非默认路径,比如解压版、绿色版,或者 PATH 里没有firefox命令。解决是在Options里用binary_location显式指向可执行文件,Windows 指向firefox.exe,Linux 和 macOS 指向firefox。指完再跑,如果还报同样的错,检查路径里有没有空格或中文,路径含空格时用原始字符串包住。

5.3 离线环境和 Selenium Manager 的隐性依赖

踩坑六:Unable to obtain driver for firefox,提示自动下载失败

现象是本地明明放了驱动,脚本却仍然尝试联网下载并失败。原因是 Selenium 4.6 之后默认启用 Selenium Manager,某些情况下它会优先走自动探测,探测不到才回退。内网或离线机器上这一步必然失败。解决办法是显式传Service(executable_path=...),把路径写死,让框架没有自动探测的余地;同时确认虚拟环境里的 Selenium 版本,太老的版本没有Service类,需要先升级。

这六条覆盖了大部分启动阶段的失败。排查时我的习惯是先看报错第一行的异常类型,再看Message:后面的原始信息,最后才回头看 Python 栈。驱动的问题,答案基本都在原始信息里。

6. 装完怎么验证:三条命令确认 geckodriver 真的被用上

装完不等于跑通,我一般按三条命令逐级验证,每一条通过再走下一步,出问题能立刻定位到是哪一层。

第一条,确认驱动本身可用:

geckodriver --version

能打印版本号和构建信息,说明文件完整、权限正确、PATH 生效。这一步失败,后面的都不用看。

第二条,确认 Python 能找到 Selenium 和驱动路径:

from pathlib import Path from selenium import webdriver from selenium.webdriver.firefox.service import Service print("selenium:", webdriver.__version__ if hasattr(webdriver, "__version__") else "unknown") print("driver exists:", Path("/usr/local/bin/geckodriver").exists())

Path.exists()返回True只说明文件在,不代表能执行;配合第一条的--version一起看才完整。

第三条,跑一次真实页面加载:

from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.webdriver.firefox.service import Service options = Options() options.add_argument("-headless") service = Service(executable_path="/usr/local/bin/geckodriver") with webdriver.Firefox(service=service, options=options) as driver: driver.get("https://example.com") assert "Example" in driver.title print("验证通过:", driver.title)

assert这一行是关键,它把“浏览器起来了”变成“页面真的加载并返回了预期标题”,比只看进程不报错可靠得多。三条都过,这套环境才算真正跑通。

验证层级命令或代码通过标准失败先查
驱动可用geckodriver --version打印版本号文件权限、PATH
路径可达Path(...).exists()返回 True路径拼写、平台差异
端到端加载页面并断言标题断言不抛异常浏览器版本、binary_location

从那以后我每次在新机器上装 geckodriver,都强制把这三条走一遍,不再靠“脚本没报错”来判断环境好了。驱动这东西,装的时候多花十分钟验证,比后面在业务代码里排查半天强。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 13:25:28

MySQL锁机制详解与高并发优化实践

1. MySQL锁机制概述 数据库锁是MySQL实现并发控制的核心机制&#xff0c;它像交通信号灯一样协调多个事务对数据的访问。当我在处理电商平台的库存扣减时&#xff0c;深刻体会到锁的重要性——没有合理的锁机制&#xff0c;高并发场景下必然会出现超卖问题。 MySQL的锁按照粒度…

作者头像 李华
网站建设 2026/10/26 13:25:15

思科设备中文化指南:语言资源版本对齐与安全回滚

很多人第一次在搜索引擎里敲下“思科汉化下载”这五个字&#xff0c;多半是被一台全英文的交换机或路由器管理界面逼到墙角了——命令行里show一大堆英文提示&#xff0c;Web 管理页面全是Interface、VLAN、Spanning Tree&#xff0c;配置一批设备下来&#xff0c;眼睛发酸不说…

作者头像 李华
网站建设 2026/10/26 13:24:48

Ubuntu部署Layer Diffusion:透明图层生成与显存调优实战

做视觉的同行大概都遇到过这种憋屈事&#xff1a;一张图生成得挺好看&#xff0c;可要把它抠出来换个背景、单独调个颜色&#xff0c;就得回 Photoshop 里一点点抠边缘&#xff0c;头发丝、纱裙、玻璃杯这种半透明材质&#xff0c;抠一次掉半条命。Layer Diffusion这套思路做的…

作者头像 李华
网站建设 2026/10/26 13:24:06

RSI与AI融合技术综述:从特征工程到模型评估

RSI&#xff08;Relative Strength Index&#xff0c;相对强弱指数&#xff09;这个指标&#xff0c;搞量化和技术分析的朋友肯定不陌生&#xff0c;但要说清楚“AI 时代的 RSI 技术”&#xff0c;很多人第一反应是“用 AI 预测 RSI 金叉死叉”&#xff0c;这个理解不能说错&am…

作者头像 李华
网站建设 2026/10/26 13:23:28

机器人坐标变换矩阵与WPR:原理、推导及易混概念辨析

简介&#xff1a;这份PDF资料聚焦Fanuc&#xff08;发那科&#xff09;机器人坐标变换矩阵&#xff0c;面向从事机器人编程、调试与离线仿真的工程师及学习者&#xff0c;系统梳理用户坐标系与世界坐标系之间的转换关系&#xff0c;帮助解决WPR姿态推导、旋转矩阵构建等实操中的…

作者头像 李华
网站建设 2026/10/26 13:23:08

DFlash引擎解析:让30B大模型在24GB显卡上稳快推理

1. 项目概述&#xff1a;为什么一个“能在24GB显卡上跑的30B模型”值得工程师连夜拆包 你有没有过这种体验&#xff1a;刚在Hugging Face上点开一个标着“30B”的开源模型&#xff0c;信心满满地准备本地部署&#xff0c;结果 torch.cuda.OutOfMemoryError 像一记闷棍砸在终端…

作者头像 李华