如何通过用户输入设置RPi.GPIO的属性?已多日搜索未得解
解决RPi.GPIO动态设置模式的问题
嘿,我懂你想通过用户输入来灵活设置RPi.GPIO模式的需求~你现在尝试用字符串拼接+setattr的思路其实走了点弯路,咱们来捋清楚问题,再给你两个简单靠谱的解决方案:
为什么原来的方法行不通?
你写的mode_chosen = "GPIO." + mode只是生成了一个字符串,但GPIO.BCM和GPIO.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,提问作者Στέργιος Μέκρας




