使用VSCode+PlatformIO编译Marlin固件时遇RuntimeError错误求助
解决Marlin固件编译时的
deque mutated during iteration错误 错误详情
编译过程中触发RuntimeError,完整错误日志如下:
Building in release mode RuntimeError: deque mutated during iteration: File "C:\Users\dobrevi\.platformio\penv\lib\site-packages\platformio\builder\main.py", line 181: env.SConscript(env.GetExtraScripts("post"), exports="env") File "C:\Users\dobrevi\.platformio\packages\tool-scons\scons-local-4.5.2\SCons\Script\SConscript.py", line 598: return _SConscript(self.fs, *files, **subst_kw) File "C:\Users\dobrevi\.platformio\packages\tool-scons\scons-local-4.5.2\SCons\Script\SConscript.py", line 285: exec(compile(scriptdata, scriptname, 'exec'), call_stack[-1].globals) File "C:\Users\dobrevi\Documents\3D\SovolSV06\Firmware\hillsoftware\buildroot\share\PlatformIO\scripts\custom_board.py", line 14: marlin.relocate_firmware(address) File "C:\Users\dobrevi\Documents\3D\SovolSV06\Firmware\hillsoftware\buildroot\share\PlatformIO\scripts\marlin.py", line 26: replace_define("VECT_TAB_ADDR", address) for define in env['CPPDEFINES']: ================================================================== [FAILED] Took 23.78 seconds ================================================================== Environment Status Duration ------------------------ -------- ------------ GD32F103RET6_sovol_maple FAILED 00:00:23.779
问题根源
错误是由于marlin.py中的replace_define函数在遍历env['CPPDEFINES'](一个deque类型集合)的同时修改了该集合,违反了Python迭代时不能修改原容器的安全规则。
修复步骤
- 打开固件目录下的
buildroot/share/PlatformIO/scripts/marlin.py文件 - 定位到
replace_define函数中的迭代代码(约第26行),将直接遍历原集合改为遍历其副本:
原代码:
修改为:for define in env['CPPDEFINES']:# 遍历副本避免迭代时修改原集合 for define in list(env['CPPDEFINES']): - 保存文件后重新执行编译
额外排查方案
若修改后仍无法编译,可尝试:
- 更新PlatformIO核心:在VSCode的PlatformIO面板中执行
PlatformIO: Upgrade PlatformIO Core - 清理编译缓存:点击PlatformIO面板中的
Clean按钮后重新编译 - 确认
custom_board.py和marlin.py未被意外修改
内容的提问来源于stack exchange,提问作者kdobrev
相关产品推荐
相关产品推荐

