You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过用户输入设置RPi.GPIO的属性?已多日搜索未得解

解决RPi.GPIO动态设置模式的问题

嘿,我懂你想通过用户输入来灵活设置RPi.GPIO模式的需求~你现在尝试用字符串拼接+setattr的思路其实走了点弯路,咱们来捋清楚问题,再给你两个简单靠谱的解决方案:

为什么原来的方法行不通?

你写的mode_chosen = "GPIO." + mode只是生成了一个字符串,但GPIO.BCMGPIO.BOARD是RPi.GPIO模块里的整数常量,不是字符串形式的属性名。直接用这个拼接后的字符串去调用setattr是找不到对应属性的,因为属性名只需要"BCM""BOARD",不需要前缀"GPIO."

方案一:用字典映射(最推荐,可读性高)

这种方法把用户输入的字符串和对应的GPIO常量做一个映射,既直观又能轻松校验输入合法性:

import RPi.GPIO as GPIO

# 获取用户输入并转为大写
user_mode = input("Enter preferred mode (BCM/BOARD): ").upper()

# 建立输入字符串与GPIO模式常量的映射表
mode_mapping = {
    "BCM": GPIO.BCM,
    "BOARD": GPIO.BOARD
}

# 校验输入并设置模式
if user_mode in mode_mapping:
    GPIO.setmode(mode_mapping[user_mode])
    print(f"模式已成功设置为 {user_mode}")
else:
    print("输入无效!请输入BCM或BOARD。")

方案二:用getattr动态获取属性(如果你坚持用反射方式)

如果一定要用反射类的方法,直接用getattr获取GPIO模块的属性即可,不需要拼接字符串:

import RPi.GPIO as GPIO

user_mode = input("Enter preferred mode (BCM/BOARD): ").upper()

try:
    # 直接从GPIO模块获取对应属性的值
    selected_mode = getattr(GPIO, user_mode)
    GPIO.setmode(selected_mode)
    print(f"模式已成功设置为 {user_mode}")
except AttributeError:
    # 输入的字符串不是GPIO模块的有效属性时抛出异常
    print("输入无效!请输入BCM或BOARD。")

这两种方法都能完美实现你想要的功能,其中字典映射的方式更清晰,也更容易维护哦~

内容的提问来源于stack exchange,提问作者Στέργιος Μέκρας

火山引擎 最新活动