提问人:JS. 提问时间:2/9/2023 最后编辑:JS. 更新时间:2/13/2023 访问量:55
IoTEdge 模块的交互式 python input()
Interactive python input() for IoTEdge Module
问:
我是python的新手,我继承了一些需要用户键盘输入的代码。当它变成一个 docker 容器时,我可以轻松地在本地运行它,并使用“-it”标志来接收我的输入并避免 EOF 错误。
while True:
key = input("Please enter:\n")
if key == "q":
break
if key == "t":
#do something
但是,代码需要在 Azure IoT 中心的 IoT Edge 设备上作为 IoT Edge 模块运行,并且似乎没有与“-it”标志等效的选项。当我在不更改的情况下将代码作为 IoT Edge 模块运行时,我收到 EOF 错误,并在“输入”行中断。
作为 IoT Edge 模块运行时,如何更改代码以满足以下要求?
- 代码可以接收来自用户的交互式输入
- 代码等待此输入(无论需要多长时间)而不会中断
我正在考虑研究消息传递和 async/await,但这仅用于测试而不是生产代码,所以我想知道这是否矫枉过正,也许有一些更简单的解决方法可以实现我想要的?
作为基本的解决方法,我尝试让代码检查文件,然后在 docker 容器中手动创建该文件,但是由于某种原因,当我这样做时,它从未进入 if 条件,而是离开了循环
while True:
if os.path.isfile(break_file_path):
break
if os.path.isfile(trigger_file_path):
#do something
#do something else
在trigger_file_path创建文件时,它从不执行“某事”,而是立即转到“其他内容”。
我还从中了解到,我只能在 while 循环完成后看到 IoTHub 中的日志,这对于某些代码来说是不利的,这些代码应该能够等待任意长时间的输入。
我希望就这些观点提供意见。谢谢。
答:
感谢您的输入。我尝试了 env 变量,但没有让它起作用。代码没有找到我在 docker 容器内创建的 env 变量,并且使用新的 env 变量重新启动 docker 容器不是我想要的。
然而,我意识到我原来的文件解决方法工作得很好。我刚刚在 IoT Edge 模块设置中混淆了 triggerfile 和 breakfile 的变量...因此,创建 triggerfile 会导致中断。一旦解决了这个问题,它就像一个魅力一样工作。:)
评论