Android主活动中无法调用Chaquopy嵌入Python函数的问题求助
解决Chaquopy调用Python函数时的AttributeError问题
核心问题分析
你遇到的AttributeError: module 'gpio_control' has no attribute 'control_gpio',本质原因是Python模块加载时被无限循环阻塞:你的代码末尾有while True: control_gpio()的顶层循环,Chaquopy加载模块时会执行所有顶层代码,导致模块永远无法完成加载,自然无法识别到control_gpio函数。
具体修复步骤
1. 修改Python代码,移除顶层无限循环
把脚本末尾的while True循环删掉,让模块能正常加载。如果需要循环执行逻辑,把循环放到Android端实现(避免阻塞Python模块加载)。修改后的Python代码示例:
import OPi.GPIO as GPIO import time def control_gpio(): GPIO.setmode(GPIO.BOARD) GPIO.setup(8, GPIO.IN) #setting pin 8 as input GPIO.setup(16, GPIO.OUT) #setting pin 16 as output GPIO.setup(24, GPIO.OUT) #setting pin 24 as output GPIO.setup(13, GPIO.OUT) #setting pin 13 as output pin8_value = GPIO.input(8) #check the condition of pin 8 if pin8_value == GPIO.HIGH: gpio_control_on() #if high, call the function else: gpio_control_off() #if low, call the function GPIO.cleanup() time.sleep(1) def gpio_control_on(): GPIO.output(24, GPIO.LOW) #if input high, pin 24 low GPIO.output(16, GPIO.HIGH) #pin 16 high GPIO.output(13, GPIO.HIGH) #pin 13 high time.sleep(2) #delay 2 seconds GPIO.output(16, GPIO.LOW) #pin 16 low GPIO.output(13, GPIO.LOW) #pin 13 low def gpio_control_off(): GPIO.output(24, GPIO.HIGH) #if input low, pin 24 high GPIO.output(13, GPIO.HIGH) #pin 13 high GPIO.output(16, GPIO.HIGH) #pin 16 high time.sleep(2) #delay 2 seconds GPIO.output(13, GPIO.LOW) #pin 13 low GPIO.output(16, GPIO.LOW) #pin 16 low
注意:移除了子函数里的
GPIO.cleanup(),因为在control_gpio末尾已经执行了清理,子函数里重复清理会导致GPIO状态提前丢失,影响后续操作。
2. 验证Python文件路径与命名
确保你的Python文件名为gpio_control.py,且存放路径正确:
- 如果你的
sys.path.append是"app/src/main/python/gpio_control",那么gpio_control.py应该放在app/src/main/python/gpio_control/目录下; - 更推荐的方式是将
sys.path设置为"app/src/main/python",然后把gpio_control.py直接放在app/src/main/python/目录下,这样加载模块更直接。
3. 修改Android端调用逻辑(实现循环)
如果需要重复执行control_gpio,在Android端用Handler实现间隔执行,避免阻塞主线程:
// 示例:用Handler实现间隔执行 private Handler handler = new Handler(Looper.getMainLooper()); private Runnable gpioRunnable = new Runnable() { @Override public void run() { try { Python py = Python.getInstance(); PyObject sys = py.getModule("sys"); PyObject sysPath = sys.get("path"); // 推荐路径:添加python根目录 sysPath.callAttr("append", "app/src/main/python"); PyObject module = py.getModule("gpio_control"); module.callAttr("control_gpio"); } catch (Exception e) { Log.e("YourTag", "Error calling Gpio Control function: " + e.getMessage()); e.printStackTrace(); } // 1秒后再次执行,对应Python里的time.sleep(1) handler.postDelayed(this, 1000); } }; // 在需要启动的地方调用 handler.post(gpioRunnable); // 在销毁时停止循环 @Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacks(gpioRunnable); }
4. 额外注意事项
- 确保Chaquopy配置正确:在
build.gradle里已经添加了Chaquopy插件,并且配置了Python版本和依赖; - 避免在Python函数里执行长时间阻塞操作,否则会卡住Android主线程,建议用异步任务或者线程处理。
内容的提问来源于stack exchange,提问作者Wan Ammar
相关产品推荐
相关产品推荐

