独立运行正常的Selenium Python脚本嵌入Odoo后报会话创建失败
Selenium嵌入Odoo后会话创建崩溃的原因与解决方法
异常核心原因(已排除ChromeDriver/Chrome版本不匹配问题)
根据独立运行脚本正常、嵌入Odoo后在InitSession阶段触发标签页崩溃的现象,问题完全来自运行上下文的环境差异,具体触发点包括:
- 运行身份的权限差异:独立运行Selenium脚本时,代码跟随当前登录的系统用户执行,拥有Chrome运行所需的全量目录访问、进程创建权限;嵌入Odoo后,Selenium代码会随Odoo服务进程运行,这类Web服务通常会以低权限专属用户启动,即便添加了
--no-sandbox参数,低权限用户依然可能因缺少临时目录写入权、进程fork权限,导致Chrome启动后核心标签页直接崩溃。 - 服务进程的资源配额限制:独立运行脚本时,系统会为当前用户分配充足的内存、进程数配额;部署Odoo的环境一般会通过systemd配置、容器cgroup规则给服务进程设置内存上限、最大子进程数,而Chrome headless模式启动时会拆分多进程完成渲染,一旦触发配额上限,就会在InitSession阶段出现标签页崩溃、会话创建失败的问题。
- 启动参数的兼容问题:从ChromeDriver日志可见,启动参数中存在拼写错误的
--log-lelvel=1(正确拼写为--log-level),独立运行时Chrome会自动忽略不识别的参数,但在受限的服务进程环境下,异常的命令行参数可能触发Chrome启动校验逻辑崩溃。 - 临时目录的挂载限制:Chrome启动时会在
/tmp下生成随机命名的用户数据目录,独立运行时当前用户对/tmp有完全读写权限;如果Odoo运行环境的/tmp被挂载为noexec(禁止执行二进制文件),或是被设置了严格的访问控制规则,会导致Chrome无法加载临时目录下的执行文件,直接触发崩溃。
对应可落地的解决方法
- 配置匹配的运行权限:给Odoo服务的运行用户分配Chrome二进制文件、ChromeDriver可执行文件、自定义临时目录的读写执行权限,不建议通过用root身份运行Odoo的方式规避权限问题。
- 调整服务资源配额:修改Odoo服务对应的systemd配置、容器cgroup规则,给运行进程分配至少1G以上的可用内存,放开单进程的最大子进程数限制,避免Chrome启动时触发资源超限崩溃。
- 优化Chrome启动参数:移除代码中手动添加的拼写错误的日志参数,补充稳定运行必需的兼容参数,调整后的参数配置示例为:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") # 替换老旧的--headless模式,稳定性更强 chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-software-rasterizer") # 指定对Odoo运行用户可写的固定用户目录,绕开/tmp的权限限制 chrome_options.add_argument("--user-data-dir=/opt/odoo/tmp/chrome_profile") chrome_options.binary_location = '/usr/bin/google-chrome' - 绕开受限的临时目录:如果环境中
/tmp被设置了noexec属性,可以在启动Chrome前修改进程环境变量,将系统临时目录指向Odoo用户可读写、可执行的自定义目录,避免Chrome临时文件加载失败。 - 修正上下文参数传递逻辑:将原脚本中依赖
sys.argv的传值逻辑替换为Odoo业务流程内的变量传值,不要在嵌入Odoo的代码中直接读取命令行参数,避免进程上下文缺失导致的执行异常。
内容的提问来源于stack exchange,提问作者Balvant Ramani
相关产品推荐
相关产品推荐

