QBoard » Artificial Intelligence & ML » AI and ML - Python » How to execute a Python function with Node.js Express

How to execute a Python function with Node.js Express

  • How can I call a Python function with my Node.js (express) backend server?
    I want to call this function and give it an image url
    def predictImage(img_path): # load model model = load_model("model.h5") # load a single image new_image = load_image(img_path) # check prediction pred = model.predict(new_image) return str(pred)
      September 23, 2021 3:18 PM IST
    0
  • Most of previous answers call the success of the promise in the on("data"), it is not the proper way to do it because if you receive a lot of data you will only get the first part. Instead you have to do it on the end event.
    /** remove warning that you don't care about */
    function cleanWarning(error) {
        return error.replace(/Detector is not able to detect the language reliably.\n/g,"");
    }
    
    function callPython(scriptName, args) {
        return new Promise(function(success, reject) {
            const script = pythonDir + scriptName;
            const pyArgs = [script, JSON.stringify(args) ]
            const pyprog = spawn(python, pyArgs );
            let result = "";
            let resultError = "";
            pyprog.stdout.on('data', function(data) {
                result += data.toString();
            });
    
            pyprog.stderr.on('data', (data) => {
                resultError += cleanWarning(data.toString());
            });
    
            pyprog.stdout.on("end", function(){
                if(resultError == "") {
                    success(JSON.parse(result));
                }else{
                    console.error(`Python error, you can reproduce the error with: \n${python} ${script} ${pyArgs.join(" ")}`);
                    const error = new Error(resultError);
                    console.error(error);
                    reject(resultError);
                }
            })
       });
    }
    module.exports.callPython = callPython;​
    call:
    const pythonCaller = require("../core/pythonCaller");
    const result = await pythonCaller.callPython("preprocessorSentiment.py", {"thekeyYouwant": value});
    

    python:

    try:
        argu = json.loads(sys.argv[1])
    except:
        raise Exception("error while loading argument")
      October 12, 2021 9:52 PM IST
    0
  • Easiest way I know of is to use "child_process" package which comes packaged with node.
    Then you can do something like:
    const spawn = require("child_process").spawn; const pythonProcess = spawn('python',["path/to/script.py", arg1, arg2, ...]);
    Then all you have to do is make sure that you import sys in your python script, and then you can access arg1 using sys.argv[1]arg2 using sys.argv[2], and so on.
    To send data back to node just do the following in the python script:
    print(dataToSendBack) sys.stdout.flush()
    And then node can listen for data using:
    pythonProcess.stdout.on('data', (data) => { // Do something with the data returned from python script });
    Since this allows multiple arguments to be passed to a script using spawn, you can restructure a python script so that one of the arguments decides which function to call, and the other argument gets passed to that function, etc.
    Hope this was clear. Let me know if something needs clarification.
      September 24, 2021 12:24 PM IST
    0
  • You can put this function in separated file; let's called it 'test.py' for example.

    In the Js file:

    const { exec } = require('child_process');
    
    function runPythonScript(){
        return new Promise((resolve, reject) => {
            exec('python test.py', (err, stdout, stderr) => {
                if(err) reject(err);
    
                resolve(stdout);
            });
        });
    }

     

    and call the function runPythonScript in express route.

    runPythonScript()
    .then(result => res.send(result))
      September 25, 2021 2:25 PM IST
    0