使用Buildozer编译Kivy安卓应用时遇SDL2_ttf Python2语法错误
解决Buildozer编译Kivy应用时SDL2_ttf的Python2 print语法错误
问题分析
编译触发的SyntaxError来自SDL2_ttf 2.20.2依赖包中freetype工具脚本chktrcmp.py的Python2语法(无括号的print语句),手动修改后会因Buildozer重新下载依赖而被覆盖,需要持久化修复方案。
解决方案
方法1:指定修复Python3兼容问题的SDL2_ttf版本
SDL2_ttf 2.20.3及以上版本已修复该Python2语法问题,修改buildozer.spec的requirements配置:
requirements = python3,kivy,kivymd==1.1.1,bcrypt,mysql-connector-python,pillow,cffi==1.14.6,libffi,sdl2_ttf==2.20.3,sdl2_image,sdl2_mixer
修改后执行buildozer android clean清理旧依赖,再重新编译即可。
方法2:用Buildozer预编译钩子自动修复脚本
通过预编译钩子,在每次编译前自动修改目标脚本的print语句:
- 在项目根目录创建
hooks文件夹,新建prebuild.py文件,写入代码:
import os import re def prebuild(buildozer): # 定位目标文件路径 target_file = os.path.join( buildozer.build_dir, "android", "app", "kivy-deps-build", "kivy-dependencies", "build", "SDL2_ttf-2.20.2", "external", "freetype", "src", "tools", "chktrcmp.py" ) if os.path.exists(target_file): with open(target_file, "r") as f: content = f.read() # 替换所有Python2风格的print语句 content = re.sub(r'print\s+(.*?)(?=\n|$)', r'print(\1)', content) with open(target_file, "w") as f: f.write(content) print(f"自动修复 {target_file} 的Python2语法") return
- 修改
buildozer.spec,添加预编译钩子配置:
[app] # 保留原有配置,新增以下行 prebuild.hooks = hooks/prebuild.py
- 执行编译命令,钩子会在编译前自动完成修复。
方法3:强制脚本用Python2执行(临时方案)
若编译环境存在Python2,可修改SDL2_ttf的编译步骤:找到Buildozer的SDL2_ttf recipe文件(通常在~/.buildozer/android/platform/python-for-android/recipes/sdl2_ttf/目录下),修改build.py中调用chktrcmp.py的部分,将python替换为python2。此方法需修改系统级recipe,灵活性较低。
内容的提问来源于stack exchange,提问作者Ben Wrench
相关产品推荐
相关产品推荐

