waf_python313_fix

ArduPilot WAF Python 3.13 兼容性修复

#作者:李荣江
#时间:2025年8月3日

问题描述

在 Python 3.13.5 环境下运行 ArduPilot 的 ./waf list_boards 命令时出现以下错误:

ModuleNotFoundError: No module named 'imp'

问题原因

  1. imp 模块已废弃:Python 3.12+ 完全移除了 imp 模块,需要使用 importlib 替代
  2. 文件打开模式 ‘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 命令能够正常执行,成功列出所有支持的板型。

注意事项

  1. 修复后仍有一些 SyntaxWarning(关于正则表达式中的无效转义序列),但这些警告不影响功能
  2. 这些修改保持了与旧版 Python 的向后兼容性(通过 try-except 结构)
  3. 建议 ArduPilot 项目更新其 WAF 构建系统以原生支持 Python 3.12+

相关链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值