Search code examples
javascriptnode.jsstdoutchild-process

Is there a way to get 'live' output lines from a python script spawned by child_process.execFile without flushing stdout every time?


I am trying to get the lines a ('never ending') python script puts into stdout. But currently my code would only log something to the console when the python process exits. Is there a way I can get the 'live' output of the python script line by line?

spawn_child.js:

let execFile = require("child_process").execFile;

var child = execFile("python3", ["PATH_TO_FILE"]);

child.stdout.on("data", data=>{
    console.log(data.toString());
});
child.stderr.on("data", data=>{
    console.log(data.toString());
});
child.on("exit", code=>{
    console.log("Child exited with code "+code);
});

The python file:

from time import sleep

while True:
    sleep(3)
    print("test")

Edit: It works when using a nodejs script instead of a python script


Solution

  • change python script to

    import time
    import sys
    
    while True:
        time.sleep(1)
        print("test")
        sys.stdout.flush()
    

    and increase the buffer size of the child process

    const child = execFile("python", ["./runner.py"], {
        detached: true,
        maxBuffer: 10 * 1024 * 1024 * 1024
    });
    

    or you can do it without the flushing to stdout with python-shell

    const { PythonShell } = require('python-shell');
    
    let pyshell = new PythonShell('runner.py');
        
    pyshell.on('message', function (message) {
        console.log(message);
    });
    
    pyshell.end(function (err, code, signal) {
        if (err) throw err;
        console.log('The exit code was: ' + code);
        console.log('The exit signal was: ' + signal);
        console.log('finished');
    });