Электрон порожден python дочерний процесс зависает при чтении в stdio - PullRequest
0 голосов
/ 28 мая 2020

У меня есть электронное приложение ("electron": "^9.0.0") в сочетании с Vue с использованием Vue плагина Cli .

Здесь есть pythonmanager.js (настроенный как свойство экземпляра Vue ), который обрабатывает порождение дочернего процесса для исполняемого файла python и обрабатывает весь ввод / вывод.

// mypage.vue

handleData() {
  // Calling pythonmanager.js from a .vue page on the press of a button
  this.$pyManager.processData(arg1, arg2).then((value) => {
    // some stuff with the return data
  }
}

// pythonmanager.js

processData = (arg1, arg2) => {
  const pythonExe = 'some/file/path/to/compiledPython.exe';
  const args = [arg1, arg2];

  return new Promise((resolve) => {
    const cp = spawn (pythonExe, args);
    cp.stdout.setEncoding('utf8');
    cp.stderr.setEncoding('utf8');

    cp.stdout.on('data', (data) => {
      EventBus.$emit(data);
    });

    cp.stderr.on('data', (err) => {
      console.log(err);
    });

    cp.stdout.on('exit', () => {
      resolve('Success');
    });
  }
}

EventBus используется для обратной связи со страницей электронного рендеринга, которая называется pythonmanager.js.

python не буферизуется с использованием print('something', flush=True)

Когда все это запускается как встроенное производственное приложение Electron, оно отлично работает. Python запускается, отправляет данные обратно, отображается на стороне электронного рендеринга. Без вопросов.

Когда я пытаюсь запустить это в разработке, это не работает. Создается дочерний процесс python, запускается python, а затем он зависает. Он может работать и читать в 1 выводе или может читать 10, но в конечном итоге он зависает и перестает читать.

Глядя на сторону python, он зависает на операторе печати и не go в дальнейшем (проверено, получая python для записи в файл, где он находится). Мне это говорит о том, что он ожидает, пока будет прочитан последний вывод, но электрон случайным образом перестает читать stdio.

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

Я пробовал разные аргументы появления, например const cp = spawn(pythonExe, args, { env: { PYTHONUNBUFFERED: true }, stdio: 'pipe' });

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