Как непрерывно запускать скрипт Python, который может получать команды от узла

Я настроил Raspberry Pi, подключенный к светодиодной ленте, которой можно управлять с моего телефона через сервер Node, который у меня работает на RasPi. Он запускает простой скрипт Python, который устанавливает цвет.

Я хочу расширить функциональность, чтобы у меня был постоянно работающий скрипт python, и я мог бы отправлять ему цвета, чтобы он потреблял новый цвет и отображал как старый, так и новый цвет рядом. То есть скрипт python может получать команды и управлять состоянием.

Я изучал, использовать ли для этого простой цикл или демона, но я не понимаю, как непрерывно запускать скрипт и получать новые команды.

Лучше ли хранить состояние на сервере Node и продолжать отправлять множество простых команд в базовый скрипт Python или написать более сложный скрипт Python, который может получать несколько простых команд и постоянно обновлять свет?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
290
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, вам не обязательно, чтобы скрипт Python работал непрерывно. Ему просто нужно сохранить состояние, и вы можете сделать это, записав состояние в файл. Затем сценарий может просто прочитать последний файл состояния при запуске, решить, что делать дальше, выполнить действие, а затем обновить файл состояния.

Однако, если вы действительно хотите запускать скрипт непрерывно, вам нужен способ принимать команды. Самый простой способ для демона принять команду, вероятно, через сигнал, вы можете использовать пользовательский сигнал, например. SIGUSR1 и SIGUSR2 для отправки и получения этих уведомлений. Этого может быть достаточно, если вашему демону нужно принять только очень простой запрос.

Для более сложного запроса, когда вам нужно фактически принимать сообщения, вы можете прослушивать сокет Unix или прослушивать сокет TCP. В этом вам может помочь модуль сокета из стандартной библиотеки. Если вы хотите создать более сложный командный сервер, вы можете даже подумать о запуске полноценного HTTP-сервера, хотя в текущей ситуации это выглядит излишним.

Is it better to keep state in the Node server and keep sending a lot of simple commands to a basic python script or to write a more involved python script that can receive few simpler commands and continuously update the lights?

На это нет прямого ответа. В каждом конкретном случае это зависит от того, насколько сложным является состояние, как часто вам нужно менять цвет, насколько вы знакомы с языками и т. д.

Другой вариант — иметь приложение Node, вызвать скрипт Python как дочерний процесс и передать ему все необходимые переменные, и вы также можете прочитать вывод python, например:

 var exec = require('child_process').exec;
 var child = exec('python file.py var1 var2', function (error, stdout, stderr) {
 }

Другие вопросы по теме