Постоянно обмениваться данными с помощью Python-оболочки - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно запустить несколько сценариев 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

1 Ответ

0 голосов
/ 08 мая 2018

Что ж, я просмотрел упаковку, которую я сделал для python-shell, и нашел вызов pyshell.end(callback) сразу после создания сценария.

Я был почти уверен, что end будет выполнен только после завершения сценария python, но бывает так, что он закрывает входной поток без завершения сценария.

Извиняюсь за отсутствие внимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...