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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:47:07