You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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语句:

  1. 在项目根目录创建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
  1. 修改buildozer.spec,添加预编译钩子配置:
[app]
# 保留原有配置,新增以下行
prebuild.hooks = hooks/prebuild.py
  1. 执行编译命令,钩子会在编译前自动完成修复。

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:12:02