无法从 Android Main Activity 中的 Python 代码调用函数

Cannot Call Function from Python Code in Android Main Activity

提问人:Wan Ammar 提问时间:11/17/2023 最后编辑:Wan Ammar 更新时间:11/21/2023 访问量:46

问:

想知道你们是否曾经遇到过使用 chaquopy 调用 python 代码中编写的函数的问题。 下面是我的python代码

import OPi.GPIO as GPIO
import time

def gpio_control_on():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(16, GPIO.OUT)
    GPIO.setup(24, GPIO.OUT)
    GPIO.setup(13, GPIO.OUT)

    GPIO.output(24, GPIO.LOW)
    GPIO.output(16, GPIO.HIGH)  # Set GPIO 16 to HIGH
    GPIO.output(13, GPIO.HIGH)  # Set GPIO 13 to HIGH
    time.sleep(2)  # Delay
    GPIO.output(16, GPIO.LOW)  # Set GPIO 16 to LOW
    GPIO.output(13, GPIO.LOW)  # Set GPIO 13 to LOW

    GPIO.cleanup()

def gpio_control_off():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(13, GPIO.OUT)
    GPIO.setup(24, GPIO.OUT)
    GPIO.setup(16, GPIO.OUT)

    GPIO.output(24, GPIO.HIGH)
    GPIO.output(13, GPIO.HIGH)  # Set GPIO 13 to HIGH
    GPIO.output(16, GPIO.HIGH)  # Set GPIO 16 to HIGH
    time.sleep(2)  # Delay
    GPIO.output(13, GPIO.LOW)  # Set GPIO 13 to LOW
    GPIO.output(16, GPIO.LOW)  # Set GPIO 16 to LOW

    GPIO.cleanup()

def control_gpio():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(8, GPIO.IN)

    pin8_value = GPIO.input(8)

    if pin8_value == GPIO.HIGH:
        gpio_control_on()
    else:
        gpio_control_off()

    time.sleep(1)

    GPIO.cleanup()

# Call the gpio_kawal function repeatedly
while True:
    control_gpio()

我调用主代码中内置的 python 代码的方式:

  // Load the python JNI library
            Python py = Python.getInstance();

            // Get the Python sys module
            PyObject sys = py.getModule("sys");

            // Get the current sys.path list
            PyObject sysPath = sys.get("path");

            // Append the Python directory to the path
            sysPath.callAttr("append", "app/src/main/python/gpio_control");

            // Load the python module
            PyObject module = py.getModule("gpio_control");

            // Call the function named "control_gpio" from the module "gpio_control"
            module.callAttr("control_gpio");
        } catch (Exception e) {
            // Log the error
            Log.e("YourTag", "Error calling Gpio Control function: " + e.getMessage());
            e.printStackTrace();
        }

调用位于 gpio_control Python 代码内部的 control_gpio 函数时发生系统错误。 有谁知道问题出在哪里? 我已经检查了我能想到的所有可能的错误。但是,系统错误不断显示。为什么?应用程序可以获取gpio_control Python 代码,但无法识别 gpio_control Python 代码中的函数。为什么?错误: 调用 Gpio 控制函数时出错:AttributeError:模块“gpio_control”没有属性“control_gpio” 这是新的 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

    GPIO.cleanup()

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()

while True:
    control_gpio() #looping for control_gpio function while app runs

但是,错误仍然显示相同的“属性错误” 我已经尝试了这两种方法,但我仍然找不到从构建的 python 代码中调用函数的方法。有什么东西可以用来将函数传递到主代码中吗?

蟒蛇 android chaquopy

评论


答:

0赞 mhsmith 11/17/2023 #1

无需添加任何内容即可使目录可访问。事实上,你已经这样做了,再加上你的调用没有卡在 Python 模块顶层的无限循环中,这让我认为你的应用程序中可能有这个模块的多个版本,而实际运行的那个版本与你问题中的版本不同。sys.pathapp/src/main/pythongetModulewhile True

如果您需要更多帮助,请编辑您的问题以包含完整的堆栈跟踪

评论

0赞 Wan Ammar 11/19/2023
但是,如果我不使用 sys.path 方法,chaquopy 需要很长时间才能上传构建的 python 程序。Android 应用程序无法识别构建的程序。因为从理论上讲,Android 应用程序会扫描放置在应用程序 Python 目录中的每个 Python 文件。现在,我只使用 sys.path 来固定构建的 python 代码的位置,以便在应用程序启动时可以直接调用构建的 python 代码
0赞 mhsmith 11/20/2023
app/src/main/python是构建期间源代码中的一个位置,但它在 Android 设备上的运行时不存在(除非您显式创建了它),因此将其添加到 sys.path 将不起作用。无论如何,sys.path 上的条目应该是绝对路径。因此,如果您在不重新安装应用程序的情况下将文件复制到设备,则必须先解决这两个问题,然后才能导入它们。
0赞 mhsmith 11/20/2023
为了确保你真的在运行你认为你正在运行的文件,试着添加一些非常明显的标记,比如让它抛出一个带有唯一消息的异常。
0赞 Wan Ammar 11/20/2023
我使用 try-catch 方法。错误显示:AttributeError:模块“gpio_control”没有属性“control_gpio”。我更改了python代码
0赞 mhsmith 11/20/2023
对不起,我认为您没有解决我的任何评论。请更仔细地再次阅读它们,并按照我的要求提供完整的堆栈跟踪。