1. 程式人生 > >python 和 node.js互動(node.js中執行python函式)

python 和 node.js互動(node.js中執行python函式)

開發環境:

  1. 系統macOS 10.13.5
  2. python
  3. node

node.js和python通過終端來互動。核心方法是

exec(cmd, function (error, stdout, stderr) { });

這裡的cmd是類似於

python py_test.py arg0 arg1...

python可以通過 sys.argv 來獲取從node.js傳遞過來的引數 ,使用print語句,將結果資料再返回到node.js。node.js使用回撥方法中的stdout引數即為python返回的資料,進行解析即可。

下面貼出程式碼:
py_test.py

#!/usr/bin/python
# -*- coding: utf-8 -*- import sys import time # 定義接收到的不同環節碼,執行不同邏輯 def foo(var): if var == '100': # 與伺服器互動 虛擬請求資料時間1秒 time.sleep(1) print('100#'+'{"sign":"1", "msg":"登入成功"}') elif var == '200': # 與伺服器互動 虛擬請求資料時間1秒 time.sleep(1) print('200#'+'{"sign":"1", "msg":"進入大廳成功"}'
) elif var == '300': # 與伺服器互動 虛擬請求資料時間1秒 time.sleep(1) print('300#'+'{"sign":"1", "msg":"匹配成功"}') else: print('run the orderError') # 引數為從命令列傳過來的引數 sys.argv ['py_test.py', arg1, arg2...] # 所以取引數要從1開始,就是第二位置開始取 foo(sys.argv[1])

nodejs_test.js

var exec = require
('child_process').exec; var cmds = ['100', '200', '300']; var no = 0; //先發第一個環節碼100,等待返回正確資料再進行傳送下一個碼 execCmd(); //該方法用於命令列執行python命令 類似於: python py_test.py arg1 //這樣在python中就可以接受傳遞過去的引數 function execCmd() { exec('python py_test.py '+ cmds[no++], function (error, stdout, stderr) { if(error){ console.error('error: ' + error); return; } console.log('receive: ' + stdout.split("#")[0] + ": " + stdout.split("#")[1]); //將返回的json資料解析,判斷是都執行下一步 var json = JSON.parse(stdout.split("#")[1]); console.log(json.msg); if(json.sign == "1" && no < 3){ execCmd(); } }); }

終端執行命令

node nodejs_test.js

完成。

不積小流無以成江河,不積跬步無以至千里。