python - 从字典运行 GPIO 命令
问题描述
我正在发布/订阅树莓派和远程网络服务器之间的消息/订阅消息。当我使用 mqtt 向 pi 发送消息时,我正在发送一个以我要运行的 pi 上的通道命名的字符串。我在名为pump1
,pump2
等的脚本中有变量,它们具有各自的 RPi 通道。我有一本字典,键是我要打开的 RPi 通道,值是执行此操作的 GPIO 命令。mqtt 消息应该与字典键匹配。如果键匹配,我想运行与该键关联的值。
下面是我的字典。当我访问字典时None
,如果我不将它们用引号括起来,我会得到这些值。当我在 GPIO 命令周围用作字符串时,我无法运行该命令。有人知道运行这些命令吗?
我也试过运行这样的东西。此方法不起作用,因为 pump1 不是一个整数,表示要打开 pi 的哪个通道,但我有名为 pump1、pump2 等的变量与 RPi 通道相关联,所以我认为它可能有效,但 python 仍然看到的是一个字符串.
mqtt.message = ['pump1','on']
GPIO.output(mqtt.message[0], False)
字典:
pumps = {
"pump1:on": GPIO.output(pump1,False),
"pump1:off": GPIO.output(pump1,True),
"pump2:on": GPIO.output(pump2,False),
"pump2:off": GPIO.output(pump2,True),
"pump3:on": GPIO.output(pump3,False),
"pump3:off": GPIO.output(pump3,True),
"waterpump:on": GPIO.output(waterpump,False),
"waterpump:off": GPIO.output(waterpump,True),
}
解决方案
他们目前指定的方式将导致在构建pumps
字典期间调用函数。相反,您希望将键的字典存储到函数中,然后在需要时调用它们。我们可以lambda
为此使用 s。这是一个简化的示例:
funcs = {
'print_int': lambda: print(1),
'print_string': lambda: print("one"),
'print_list': lambda: print([]),
}
然后,您可以通过使用键索引并调用函数来调用 then,如下所示:
>>> funcs['print_int']()
1
>>> funcs['print_string']()
one
>>> funcs['print_list']()
[]
您还可以拥有带参数的函数,如下所示:
funcs = {
'print_num': lambda num: print(num),
}
>>> funcs['print_num'](123)
123
对于您的用例,使用参数,这可能看起来像
pumps = {
"pump1": lambda state: GPIO.output(pump1, not state),
}
pumps['pump1'](True) # to turn pump on
或者如果您不想使用参数,只需:
pumps = {
"pump1:on": lambda: GPIO.output(pump1, False),
"pump1:off": lambda: GPIO.output(pump1, True),
}
推荐阅读
- azure - Bot 在模拟器中完美运行,但在 webchat 中的测试中部署时失败发送失败重试错误
- python - 从 Jenkins 运行 Python 脚本时出现语法错误
- javascript - Second Promise 是否会等待 First Promise 完成才开始
- codenameone - 未能使用 LocalNotificationCallBack 显示使用 Codenameone 显示通知的表单
- c# - 如何使用 PostSharp 定义不变量和后置条件?
- rest - WSO2 Identity Server - 用于权限和角色的 REST API
- php - 根据唯一 ID 在 php 中计数
- android - 如何在 Android 服务中获取 ReactContext?
- php - 在 PHP 嵌套 for 循环中将 O(n4) 复杂度优化为 O(n)
- windows - 如何要求 Windows 10 索引 UWP 应用中的 USB 密钥?