Мне нужно запустить несколько сценариев Python с узла. Поскольку в моих скриптах на python используются сложные структуры, я подумал, что было бы лучше, если бы я загружал эти структуры только один раз, а затем запускал некоторые конкретные скрипты (задачи), используя структуры.
На узле я хочу запустить скрипт навсегда (или пока я не скажу, что он может завершиться) и продолжать отправлять сообщения по требованию в этот скрипт. Этот скрипт создаст процесс, использующий python multiprocessing
, для запуска конкретной задачи и возобновления прослушивания.
Вариант использования:
- Узел запускается и запускает скрипт Python
- Некоторое действие на клиенте узла заставляет его отправить
command
скрипту python
- Скрипт python вычисляет, что ему нужно, и возвращает данные
Я думаю python-shell
может помочь мне с этим
На узле у меня есть что-то вроде этого:
var app = express();
app.listen(8000, function () {
console.log('Example app listening on port 8000!');
});
var pyshell = new PythonShell('start.py', options);
pyshell.on('message', function (message) {
handleAnswer(message);
});
pyshell.end(function (err, code, signal) {
handleEnd(err, code, signal);
});
app.get('/hello', function (req, res) {
pyshell.send('hello');
});
Мой start.py
скрипт:
import sys
def listen():
while True:
command = sys.stdin.readline()
command = command.split('\n')[0]
if command:
print("Received CMD " + command)
if __name__ == '__main__':
data = json.loads(sys.argv[1])
listen()
Я попытался найти решение по этому подобному вопросу , но получаю сообщение об ошибке при переносе сообщения hello
в конечную точку.
Мне требуется модуль python-shell
, и я могу выполнить скрипт на Python и вернуть данные (используя print
). Моя проблема - запустить скрипт и отправить сообщение через (случайный) период времени.
Когда я открываю localhost:8000/hello
я получаю Error: write after end
Полная ошибка:
Error: write after end
at writeAfterEnd (_stream_writable.js:236:12)
at Socket.Writable.write (_stream_writable.js:287:5)
at Socket.write (net.js:717:40)
at PythonShell.send (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\python-shell\index.js:206:16)
at C:\Users\leonardo.schettini\Documents\recrutai\client\app.js:27:12
at Layer.handle [as handle_request] (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\index.js:281:22