ArduPilot WAF Python 3.13 兼容性修复
#作者:李荣江
#时间:2025年8月3日
问题描述
在 Python 3.13.5 环境下运行 ArduPilot 的 ./waf list_boards 命令时出现以下错误:
ModuleNotFoundError: No module named 'imp'
问题原因
imp模块已废弃:Python 3.12+ 完全移除了imp模块,需要使用importlib替代- 文件打开模式 ‘U’ 已废弃:Python 3.13 不再支持 ‘rU’ 模式(universal newlines mode)
解决方案
1. 修复 imp 模块导入问题
文件:/home/lrj/ADRC/pr-adrc/原版/ardupilot/modules/waf/waflib/Context.py
修改1 - 导入部分(第9-13行):
# 原代码
import os, re, imp, sys
# 修改后
import os, re, sys
try:
import importlib.util
except ImportError:
import imp
修改2 - 模块创建部分(第667-670行):
# 原代码
module = imp.new_module(WSCRIPT_FILE)
# 修改后
try:
module = importlib.util.module_from_spec(importlib.util.spec_from_loader(WSCRIPT_FILE, loader=None))
except (NameError, AttributeError):
module = imp.new_module(WSCRIPT_FILE)
2. 修复文件读取模式问题
文件1:/home/lrj/ADRC/pr-adrc/原版/ardupilot/modules/waf/waflib/Context.py
第672行:
# 原代码
code = Utils.readf(path, m='rU', encoding=encoding)
# 修改后
code = Utils.readf(path, m='r', encoding=encoding)
文件2:/home/lrj/ADRC/pr-adrc/原版/ardupilot/modules/waf/waflib/ConfigSet.py
第315行:
# 原代码
code = Utils.readf(filename, m='rU')
# 修改后
code = Utils.readf(filename, m='r')
验证结果
修复后,./waf list_boards 命令能够正常执行,成功列出所有支持的板型。
注意事项
- 修复后仍有一些 SyntaxWarning(关于正则表达式中的无效转义序列),但这些警告不影响功能
- 这些修改保持了与旧版 Python 的向后兼容性(通过 try-except 结构)
- 建议 ArduPilot 项目更新其 WAF 构建系统以原生支持 Python 3.12+
7296

被折叠的 条评论
为什么被折叠?



