Chaquopy调用Python脚本报错AttributeError: module 'script' has no attribute 'mainTextCode' 求助
Chaquopy调用Python脚本报错AttributeError: module 'script' has no attribute 'mainTextCode' 求助
看起来你在Chaquopy和Flutter的集成上踩了几个常见的坑,我来一步步帮你理清问题并解决:
一、先解决你遇到的AttributeError问题
你之前碰到的AttributeError: module 'script' has no attribute 'mainTextCode',本质原因只有两种可能:
- 你的
script.py文件里根本没定义mainTextCode这个函数/变量,但你在代码里尝试调用了它; - 函数名拼写错误——比如你在Python脚本里写的是
main_text_code(下划线命名),但在Flutter里调用的是驼峰式的mainTextCode,大小写或格式不匹配导致找不到属性。
如果当时你是想通过模块导入的方式调用Python逻辑,正确的做法是:
- 把
script.py放在android/app/src/python目录下(Chaquopy会自动识别这个目录下的文件为Python模块); - 在
script.py里明确定义mainTextCode函数,并且返回Flutter能解析的格式:
import random def mainTextCode(): # 返回一个包含textOutput的字典,和你Flutter代码里的解析逻辑对应 return {"textOutput": str(random.randint(1, 100))}
- 在Flutter里用
invokeMethod调用这个模块函数,而不是executeCode:
final result = await Chaquopy.invokeMethod("script", "mainTextCode");
二、针对你当前的executeCode方案优化
看你现在的代码改成了从assets加载placeholder.py并直接执行,这里有个关键问题:你的Python脚本只定义了get_random_number函数,但没有执行它也没有返回预期的结果格式,导致Flutter里拿到的result不是你想要的带textOutput的Map。
修改你的placeholder.py,确保最后返回包含textOutput的字典:
import random def get_random_number(): return random.randint(1, 100) # 执行函数并构造Flutter期望的返回结构 output_dict = {"textOutput": str(get_random_number())} output_dict # 这一行必须加!Chaquopy会把代码最后一行的表达式结果返回给Flutter
另外还要检查pubspec.yaml里是否正确声明了assets路径,确保Flutter能加载到这个脚本:
flutter: assets: - assets/python/
三、额外的注意事项
- Chaquopy的两种用法区分:
- 模块导入(
invokeMethod):适合复杂的Python项目,支持多脚本依赖,脚本放在android/app/src/python; - 直接执行代码(
executeCode):适合简单的代码片段,脚本可以放在assets里,但要注意代码的执行结果要符合预期格式。
- 模块导入(
- 文件名和模块名的大小写:Android系统是区分文件名大小写的,比如
Script.py和script.py会被识别成两个不同的模块,一定要保持一致。
这样修改后,你应该就能正常调用Python函数并获取随机数结果了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

