Heroku部署Selenium Python Discord Bot报driver未定义错误
问题排查结论
NameError: name 'driver' is not defined 本身不是缺少依赖、未预装Chrome/ChromeDriver直接导致的报错——如果环境缺少浏览器或驱动文件,Selenium会抛出WebDriverException类的异常,不会触发变量未定义的语法级错误。
这个报错的核心原因是:你代码中命名为driver的Selenium浏览器实例,在Heroku环境的指令执行路径中没有被成功赋值,本质是本地和Heroku的运行环境差异触发了两类问题:
- 作用域问题:
driver的初始化代码写在了不会被Heroku启动流程触发的代码块里,或者初始化时没有声明全局变量,导致指令调用时访问不到这个变量 - 初始化失败:
driver赋值前的初始化逻辑在Heroku环境提前抛出异常,导致赋值语句根本没有执行完成,后续调用时自然找不到该变量
本地运行正常是因为你的本地设备有GUI环境、预装了Chrome浏览器,初始化流程可以顺利走完,不会触发上述问题。
修复方案
按以下顺序排查调整即可:
- 修正
driver的作用域逻辑
不要把driver = webdriver.Chrome(...)的初始化代码写在if __name__ == '__main__':块中——Heroku的进程启动逻辑不一定会触发这个判断块内的代码。
如果把初始化逻辑写在on_ready这类启动事件回调中,必须在赋值前声明全局变量,参考写法:import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 先全局声明占位,避免直接调用报未定义 driver = None @bot.event async def on_ready(): global driver chrome_options = Options() # Heroku运行Selenium必须加以下无头配置,否则初始化必然失败 chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # 指定Heroku环境下Chrome的安装路径 chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN", "/app/.apt/usr/bin/google-chrome") # 自动匹配对应版本的ChromeDriver,不需要手动上传驱动文件 driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=chrome_options ) - 给初始化逻辑加异常捕获,定位真实报错
把初始化代码包裹在异常捕获中打印日志,就能确认是不是因为浏览器配置、依赖缺失导致初始化中断:@bot.event async def on_ready(): global driver try: # 放入上述初始化代码 print("Selenium驱动初始化完成") except Exception as e: print(f"驱动初始化失败,真实错误信息:{repr(e)}") - 配置Heroku运行依赖
首先在项目根目录的requirements.txt中加入必要依赖:
之后在Heroku应用后台的Settings-Buildpacks栏目添加两个必要构建包,重新部署即可:一个是Chrome浏览器构建包,一个是对应版本的ChromeDriver构建包,和Python默认构建包配合就能正常运行Selenium。discord.py>=2.0 selenium>=4.0 webdriver-manager - 优化实例生命周期(可选但推荐)
Heroku的dyno存在休眠、内存回收机制,全局长期持有同一个driver实例很容易出现连接失效、进程崩溃问题。更稳妥的写法是在每次触发需要用到Selenium的Discord指令时,单独初始化driver实例,业务逻辑执行完成后立刻调用driver.quit()释放资源,避免全局变量异常。
内容的提问来源于stack exchange,提问作者Gromovv
相关产品推荐
相关产品推荐

