У меня есть электронное приложение ("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' });