Python + JavaScript = πŸ”₯πŸ”₯πŸ”₯

Shuvo - Oct 21 '21 - - Dev Community

When in comes to Web Development nothing beats JavaScript. But sometimes we have to do a bit more demanding task, for example analyzing big pile of data. In that case Python might be a superior option. But that's just one function of our website. Do we want to switch to Python just because of that one feature? Probably not.

So what if we could build our backend mostly using NodeJS and only use Python when we have to.

That would be awesome right? We can use child process in Node.JS to run a python script when needed.

const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
    spawn('python3', ['script.py'])
})
Enter fullscreen mode Exit fullscreen mode
# script.py
doSometing()
Enter fullscreen mode Exit fullscreen mode

And if we want we can pass data to our python script also.

const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
    const msg = "Hello"
    spawn('python3', ['script.py', msg])
})
Enter fullscreen mode Exit fullscreen mode

In Python in order to be able to read the data you must import the sys module.

import sys, json

def main():
    msg = sys.argv[1]
    doSometing(msg)

if __name__ == '__main__':
    main()
Enter fullscreen mode Exit fullscreen mode

Now instead on passing data while spawning the Python process, lets send data in stream.

const spawn = require('child_process').spawn,
const py = spawn('python3', ['script.py'])
const data = {
    msg: "Hello"
}

py.stdin.write(JSON.stringify(data)) //we have to send data as a string, so we are using JSON.stringify
py.stdin.end()
Enter fullscreen mode Exit fullscreen mode
import sys, json

def main():
    lines = sys.stdin.readlines()
    data = json.loads(lines)
    doSometing(data['msg'])

if __name__ == '__main__':
    main()
Enter fullscreen mode Exit fullscreen mode

Finally we can send response back to our nodejs from the python script

const spawn = require('child_process').spawn
const py = spawn('python3', ['cscript.py'])

py.stdout.on('data', function(res){
   let data = JSON.parse(res.toString())
   console.log(data)
})
Enter fullscreen mode Exit fullscreen mode
import sys

# You will have your own implementation of get data. In this case lets assume it returns a dict/json
res = getData()
print(json.dumps(data))

sys.stdout.flush()
Enter fullscreen mode Exit fullscreen mode

So this article has come to an end. But make sure you check out my other articles.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .