沒想到 NodeJS 也能調(diào)用 Python ?

今天看了一篇文章覺得很有趣,沒想到 NodeJS 也能調(diào)用 Python,眾所周知,Python 語言這幾年紅的不得了,在結(jié)合當(dāng)今流行的 JavaScript ,強強聯(lián)合,給了我們更多想象空間,在一些場景下,可以進行一些嘗試。廢話不多說,我們來看看兩者是怎么結(jié)合進行互相調(diào)用。
NodeJS 作為后端,僅在需要時調(diào)用 Python
在某些特殊的場景下,比如復(fù)雜耗時的數(shù)據(jù)處理和運算時,我們可以用 Python 腳本編寫,然后使用 Node 的子進程調(diào)用 ?Python 腳本即可,這樣可以提升效率。如下代碼,我們可以使用 Node.js 的 API child_process.spawn(command[, args][, options]) 進行調(diào)用 Python 腳本:
const?spawn?=?require('child_process').spawn
app.get("process_data",?(req,?res)?=>?{
????spawn('python3',?['script.py'])
})
Python 腳本:
#?script.py
doSometing()
如果我們的 Node 腳本向 Python 腳本傳遞參數(shù),那該怎么傳呢,如下段代碼所示:
const?spawn?=?require('child_process').spawn
app.get("process_data",?(req,?res)?=>?{
????const?msg?=?"Hello"
????spawn('python3',?['script.py',?msg])
})
這時我們需要改下 Python 的腳本,接收 NodeJS 傳過的參數(shù)。如下段代碼所示:
import?sys,?json
def?main():
????msg?=?sys.argv[1]
????doSometing(msg)
if?__name__?==?'__main__':
????main()
如果傳輸 JSON 這樣復(fù)雜的數(shù)據(jù),我們需要改寫 Node 的寫法,以數(shù)據(jù)流的形式傳遞給 Python ,示例代碼如下:
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()
接下來我們來改下 Python 腳本,接收 Node 前端傳送的數(shù)據(jù)流,進行下一步的邏輯處理
import?sys,?json
def?main():
????lines?=?sys.stdin.readlines()
????data?=?json.loads(lines)
????doSometing(data['msg'])
if?__name__?==?'__main__':
????main()
Node 除了可以往 Python 傳遞數(shù)據(jù),同時可以接收 Python 傳遞的數(shù)據(jù),接下來我們來改寫 Node 相關(guān)的腳本,示例代碼如下:
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)
})
最后調(diào)整 Python 腳本,用于向 Node 前端傳送數(shù)據(jù),示例代碼如下:
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()
今天的文章就分享到這里,是不是很簡單呢,感謝你的閱讀,有了這些示例后,你可以嘗試下在業(yè)務(wù)中進行運用,你會發(fā)現(xiàn) Python + NodeJS 的強大之處,如果你有好的應(yīng)用和想法,別忘記在留言區(qū)分享喲
參考來源:
作者:Shuvo
來源:https://dev.to/0shuvo0/copy-text-to-clipboard-in-jstwo-ways-1pn1
