IoTEdge 模块的交互式 python input()

Interactive python input() for IoTEdge Module

提问人:JS. 提问时间:2/9/2023 最后编辑:JS. 更新时间:2/13/2023 访问量:55

问:

我是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 模块运行时,如何更改代码以满足以下要求?

  1. 代码可以接收来自用户的交互式输入
  2. 代码等待此输入(无论需要多长时间)而不会中断

我正在考虑研究消息传递和 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 中的日志,这对于某些代码来说是不利的,这些代码应该能够等待任意长时间的输入。

我希望就这些观点提供意见。谢谢。

Python Docker 交互式 EOF Azure-IoT-Edge

评论


答:

0赞 JS. 2/13/2023 #1

感谢您的输入。我尝试了 env 变量,但没有让它起作用。代码没有找到我在 docker 容器内创建的 env 变量,并且使用新的 env 变量重新启动 docker 容器不是我想要的。

然而,我意识到我原来的文件解决方法工作得很好。我刚刚在 IoT Edge 模块设置中混淆了 triggerfile 和 breakfile 的变量...因此,创建 triggerfile 会导致中断。一旦解决了这个问题,它就像一个魅力一样工作。:)