Есть ли способ вызвать Python скрипт из Node.js и показать его результаты, как только они будут сгенерированы? - PullRequest
0 голосов
/ 07 февраля 2020

Я хотел бы выполнить скрипт Python из приложения Node.js (Электрон. js, чтобы указать c). Я хотел бы показать вывод, как только он будет сгенерирован. Скрипт Python - это большой скрипт, который требует много времени для обработки, но он регулярно выводит данные.

Я пробовал это использовать python -shell и child_process . Однако, когда я выполняю файл Python, вывод отображается только после завершения программы.

Я думал, что это можно сделать, используя shell.on('message',function(){}) или scriptExecution.stdout.on('data',function()), но, очевидно, это не так.

Возможно ли это? Как мне это сделать? Может быть, использовать другой способ ...

1 Ответ

1 голос
/ 07 февраля 2020

Как указал @antont, получение Python результатов, как только они появятся на стандартном выводе, это легко сделать с помощью механизма flu sh.

Как это сделать

Я протестировал 3 способа сделать это:

  1. Внутри Python код , передать параметр ключевого слова для печати:

    print('text', flush=True)
    
  2. Внутри Python код , используя явный грипп sh:

    import sys
    # Do this every time you want to flush
    sys.stdout.flush()
    
  3. При вызове Python исполняемый файл , дайте ему возможность всегда использовать flu sh:

    python -u scriptName.py
    

    (см. ниже два примера использования python -shell и child_process .

Node.js Примеры

Использование python -оболочка

ключевой частью этого примера является '-u' в pythonOptions: ['-u'], если вы уберете эту опцию, Python не будет автоматически вызывать грипп sh (если вы не используете методы 1 или 2 сверху).

let PythonShellLibrary = require('python-shell');
let {PythonShell} = PythonShellLibrary;
let shell = new PythonShell('/home/user/showRandomWithSleep.py', {
    // The '-u' tells Python to flush every time
    pythonOptions: ['-u']
});
shell.on('message', function(message){
    window.console.log('message', message);
    window.console.log(new Date())
})

Использование child_process

Ключевой частью этого примера является '-u' в spawn(pythonExecutable, ['-u', myPythonScript]), если Вы удаляете эту опцию Python не будет автоматически вызывать грипп sh (если вы не используете методы 1 или 2, описанные выше).

var myPythonScript = "/home/user/showRandomWithSleep.py";
var pythonExecutable = "python";
var uint8arrayToString = function(data) {
    return String.fromCharCode.apply(null, data);
};
const spawn = require('child_process').spawn;
// The '-u' tells Python to flush every time
const scriptExecution = spawn(pythonExecutable, ['-u', myPythonScript]);
scriptExecution.stdout.on('data', (data) => {
    console.log(uint8arrayToString(data));
    window.console.log(new Date())
});

showRandomWithSleep.py, файл python, используемый в приведенных выше примерах

from random import *
import time
for i in range(5):
    print("showRandomWithSleep.py")
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    print(random())
    time.sleep(random()*5)

Примечание

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

При использовании python -оболочка отпечатки выводится для каждой print() строки. Однако при использовании child_process отпечатки выводятся в блоках. Я не знаю, почему это происходит.

Ссылки

...