运行无限循环并从“外部”获取命令(例如shell或其他脚本)

时间:2019-01-04 00:29:06

标签: python

我正在使用Raspberry Pi,它正在处理一些WS2812B RGB-LED。我可以使用neopixel库和Python控制灯光以及一切。现在很好。

我希望此Python脚本运行一个仅处理灯光管理的无限循环。调光LED,改变颜色等等。但是,我希望能够从其他脚本中获取命令。假设我要输入将更改颜色的shell命令。在我的无限Python脚本(LED处理程序)中,我将能够识别该命令并将颜色或灯光模式柔和地更改为所需的颜色。

一个想法是,如果有新命令,则要不断查找文本文件。而且我的Shell脚本能够在此文本文件中插入命令行。

但是您能告诉我,是否有更好的解决方案?

非常感谢。

4 个答案:

答案 0 :(得分:3)

一种方法是公开一个TCP服务器,然后通过TCP与Python进程通信。这里是一个有关如何创建TCP服务器的简单示例,其中展示了服务器脚本(运行LED)和命令脚本:example

答案 1 :(得分:2)

我建议使用您的python脚本打开一个端口,并使其从该端口接收命令(网络编程)。尽管这会使您的项目更加复杂,但它是一个非常可靠的实现。

答案 2 :(得分:1)

您可以使用ZeroMQ并将其托管在本地。它提供了bindings for Python。这是一个示例脚本(发送方和接收方):

from threading import Thread
import zmq


class Sender(Thread):
    def run(self):
        context = zmq.Context()
        socket = context.socket(zmq.PUB)
        socket.connect('tcp://127.0.0.1:8000')
        while True:
            socket.send_string(input('Enter command: '))


class Receiver(Thread):
    def run(self):
        context = zmq.Context()
        socket = context.socket(zmq.SUB)
        socket.bind('tcp://127.0.0.1:8000')
        socket.setsockopt(zmq.SUBSCRIBE, b'')
        while True:
            data = socket.recv().decode('ascii')
            print(data)  # Do stuff with data.

接收器将是控制RPi上的灯的实例,发送器将是使您输入各种命令的命令行脚本。优点是ZeroMQ支持bindings for various programming languages,并且您还可以通过网络发送/接收命令。

答案 3 :(得分:0)

另一种解决方案是允许来自网络连接的命令。带有“无限循环”的脚本将从套接字读取输入并执行命令。