You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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浏览器,初始化流程可以顺利走完,不会触发上述问题。
修复方案

按以下顺序排查调整即可:

  1. 修正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
        )
    
  2. 给初始化逻辑加异常捕获,定位真实报错
    把初始化代码包裹在异常捕获中打印日志,就能确认是不是因为浏览器配置、依赖缺失导致初始化中断:
    @bot.event
    async def on_ready():
        global driver
        try:
            # 放入上述初始化代码
            print("Selenium驱动初始化完成")
        except Exception as e:
            print(f"驱动初始化失败,真实错误信息:{repr(e)}")
    
  3. 配置Heroku运行依赖
    首先在项目根目录的requirements.txt中加入必要依赖:
    discord.py>=2.0
    selenium>=4.0
    webdriver-manager
    
    之后在Heroku应用后台的Settings-Buildpacks栏目添加两个必要构建包,重新部署即可:一个是Chrome浏览器构建包,一个是对应版本的ChromeDriver构建包,和Python默认构建包配合就能正常运行Selenium。
  4. 优化实例生命周期(可选但推荐)
    Heroku的dyno存在休眠、内存回收机制,全局长期持有同一个driver实例很容易出现连接失效、进程崩溃问题。更稳妥的写法是在每次触发需要用到Selenium的Discord指令时,单独初始化driver实例,业务逻辑执行完成后立刻调用driver.quit()释放资源,避免全局变量异常。

内容的提问来源于stack exchange,提问作者Gromovv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:09:42