Call python script using node.js child_process

20,379

Solution 1

There is no problem ...

Here is a slight tweak of your working code (I convert the buffer to string so its human readable)

// spawn_python.js
var util = require("util");

var spawn = require("child_process").spawn;
var process = spawn('python',["python_launched_from_nodejs.py"]);

util.log('readingin')

process.stdout.on('data',function(chunk){

    var textChunk = chunk.toString('utf8');// buffer to string

    util.log(textChunk);
});

and here is your python

# python_launched_from_nodejs.py
import sys

data = "this began life in python"
print(data)
sys.stdout.flush()

finally here is output of a run

node spawn_python.js 
11 Dec 00:06:17 - readingin
11 Dec 00:06:17 - this began life in python

node --version

v5.2.0

Solution 2

I was also facing the same issue, I found this:

var myPythonScript = "script.py";
// Provide the path of the python executable, if python is available as 
// environment variable then you can use only "python"
var pythonExecutable = "python.exe";

// Function to convert an Uint8Array to a string
var uint8arrayToString = function(data){
    return String.fromCharCode.apply(null, data);
};

const spawn = require('child_process').spawn;
const scriptExecution = spawn(pythonExecutable, [myPythonScript]);

// Handle normal output
scriptExecution.stdout.on('data', (data) => {
   console.log(uint8arrayToString(data));
});

// Handle error output
scriptExecution.stderr.on('data', (data) => {
    // As said before, convert the Uint8Array to a readable string.
    console.log(uint8arrayToString(data));
});

scriptExecution.on('exit', (code) => {
    console.log("Process quit with code : " + code);
});

Solution 3

Your python code is not correct:

import sys

data = "test"
print(data)   ###not test
sys.stdout.flush()
Share:
20,379
Bing Gan
Author by

Bing Gan

Updated on February 26, 2020

Comments

  • Bing Gan
    Bing Gan over 4 years

    I was trying to call a python code from my node file.

    Here is my node.js Code:

    var util = require("util");
    
    var spawn = require("child_process").spawn;
    var process = spawn('python',["workpad.py"]);
    
    util.log('readingin')
    
    process.stdout.on('data',function(data){
        util.log(data);
    });
    

    and my python part:

    import sys
    
    data = "test"
    print(data)
    sys.stdout.flush()
    

    In the cmd window, only util.log('readingin') is shown. What's the problem of my code?

  • Bing Gan
    Bing Gan over 8 years
    what do you mean by not test?
  • MikeZhang
    MikeZhang over 8 years
    @BingGan its name is not test, it's 'data'