提问人:Wan Ammar 提问时间:11/17/2023 最后编辑:Wan Ammar 更新时间:11/21/2023 访问量:46
无法从 Android Main Activity 中的 Python 代码调用函数
Cannot Call Function from Python Code in Android Main Activity
问:
想知道你们是否曾经遇到过使用 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 代码中调用函数的方法。有什么东西可以用来将函数传递到主代码中吗?
答:
0赞
mhsmith
11/17/2023
#1
无需添加任何内容即可使目录可访问。事实上,你已经这样做了,再加上你的调用没有卡在 Python 模块顶层的无限循环中,这让我认为你的应用程序中可能有这个模块的多个版本,而实际运行的那个版本与你问题中的版本不同。sys.path
app/src/main/python
getModule
while 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
对不起,我认为您没有解决我的任何评论。请更仔细地再次阅读它们,并按照我的要求提供完整的堆栈跟踪。
评论