Nodejs與Python腳本語言混編

最近在做一個項目,可能會涉及到機器學習部分,同伴使用python作爲機器學習算法的實現語言。由於是基於web的應用,確實可以完全用python實現web應用開發以及機器學習的實現。但是由於對Dijango接觸不多,熟練度不及Nodejs。所以打算採用混合編程實現在JavaScript代碼中調用python腳本。

Nodejs必要模塊child_process

實現原理非常簡單,使用child_process這個模塊其實是幫助開發者在nodejs環境中建立一個子進程。然後在這個子進程中使用系統命令行運行python腳本,如python test_py.py arg0 arg1實現對python腳本的調用。

child_process 模塊詳解

child_process 是用於生成子進程的重要模塊,它提供了調用子進程的方法以及傳遞參數給子進程的方法,其重要的屬性以及函數可以參考官方的API:https://nodejs.org/dist/latest-v4.x/docs/api/documentation.html.
child_process講解完畢我們開始測試,首先寫一個簡單的python測試腳本test_py.py代碼如下:

#encode:utf-8
import sys
for i in range(len(sys.argv)):
    print('arg'+str(i),sys.argv[i])

上述代碼完成的功能即是打印通過命令行運行python腳本代碼時傳遞的參數,python腳本中使用了sys模塊。這個模塊中的argv屬性是一個list,存放使用系統命令行運行python腳本時傳入的參數和腳本文件的名稱,當然argv的第一個值即是腳本名稱,從第二個值往後纔是命令行傳入的參數,上述代碼運行效果如下:

python運行結果

在nodejs中需要實現調用這個腳本,那麼相應的javaScript代碼如下:

var exec = require('child_process').exec;
var arg1 = 'hello';
var arg2 = 'world';
var filename = 'test_py.py'
exec('python'+' '+filename+' '+arg1+' '+arg2,function(err,stdout,stderr){
    if(err)
    {
        console.log('stderr',err);
    }
    if(stdout)
    {
        console.log('stdout',stdout);
    }

});

最後在命令行下執行的結果爲:

nodejs運行結果

我們可以看到從python腳本輸出到控制檯的內容在nodejs的程序中被完全解析爲字符串,存放於回調函數的輸入參數stdout中。因此如果我們需要實現nodejs腳本調用python腳本並且獲取python腳本輸出的結果時可以選擇在python腳本中對計算結果進行打印,然後在nodejs的腳本中對這個打印的字符串進行解析即可。
javascript中處理的對象多是JSON。因此要實現友好的兩種腳本語言交互可以在python中先對要交互的內容生成json字符串,然後使用print打印輸出,而javascript 代碼獲取這個字符串後可以直接進行json對象轉換。實例如下:
首先是python代碼,實現將json對象轉換爲字符串輸出到控制檯:

import json # import the module of json
import sys # this module is used to get the params from cmd
params = sys.argv[1]
obj = json.loads(params) #str to obj
jsonob = {'name':'alex','age':18,'gender':'male'}
strjson = json.dumps(jsonob,sort_keys=True)
print(strjson)

python代碼接收來自於命令行的參數,然後輸出一個json對象對應的字符串。
javascript代碼實現將python腳本輸出的json字符串轉換爲json對象如下:

var exec = require('child_process').exec;
filename = 'test_pyjson.py'
var editor={
    "name":'alex',
    "age":18,
    "address":'fghjh'
};
var str = '{\\"name\\":\\"alex\\",\\"age\\":18,\\"address\\":\\"sdsdd\\"}'; //change the javascriptobject to jsonstring
exec('python '+filename+' '+str,function(err,stdout,stdin){

    if(err){
        console.log('err');
    }
    if(stdout)
    {
        //parse the string
        console.log(stdout);
        var astr = stdout.split('\r\n').join('');//delete the \r\n
        var obj = JSON.parse(astr);

        console.log('name',obj.name);
        console.log('age',obj.age);
        console.log('gender',obj.gender);

    }


});

執行javascript代碼:

最終輸出

可以看到javascript成功的解析Python代碼執行的命令行輸出結果,實現了javascript與python的混編。

小結

nodejs 調用腳本與其他腳本的交互過程主要就是三步:javascript代碼中使用child_process模塊創建子進程,子進程調用命令行並且傳遞參數完成其他語言腳本代碼的調用,根據其他語言的控制檯輸出的字符串進行JSON格式的解析,進而完成了Nodejs與其他腳本語言的交互過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章