如何使用 child process spawn() 方法從 Node.js 執行 Python 指令碼?


NodeJs 和 Python 是開發者和網頁設計師最喜歡的兩種主要語言。但是,在一些領域 NodeJs 不如 Python,例如數值和科學計算(AI、機器學習、深度學習等)。而 Python 提供了許多庫,可以更輕鬆地進行科學計算。

幸運的是,我們可以透過在後臺執行 Python 並返回結果,在 Nodejs 應用程式中利用 Python 庫。

為此,我們將使用 NodeJs 的 child_process 標準庫在後臺生成一個 Python 程序,進行計算並將結果返回到我們的 Node 程式。

Python 指令碼

我們將編寫一個簡單的 Python 指令碼,它會在執行過程中將訊息輸出到標準輸出。

#Import library
import sys, getopt, time
def main(argv):
   argument = ''
   usage = 'usage: myscript.py -f <sometext>'
   # parse incoming arguments
   try:
      opts, args = getopt.getopt(argv,"hf:",["foo="])
   except getopt.GetoptError:
      print(usage)
      sys.exit(2)
   for opt, arg in opts:
      if opt == '-h':
         print(usage)
         sys.exit()
      elif opt in ("-f", "--foo"):
         argument = arg
   # print output
   print("Start : %s" % time.ctime())
   time.sleep( 2 )
   print('Foo is')
   time.sleep( 2 )
   print(argument)
   print("End : %s" % time.ctime())
if __name__ == "__main__":
main(sys.argv[1:])

輸出

>python myscript.py -f "Hello, Python"
Start : Wed Feb 20 07:52:45 2019
Foo is
Hello, Python
End : Wed Feb 20 07:52:49 2019

如果我們嘗試使用引數執行,將會生成與上面相同的輸出。

>python myscript.py --foo "Hello, Python"
>python myscript.py –h

輸出

usage: myscript.py -f <Hello, Python>

NodeJs 互動

我們的 Nodejs 指令碼將首先呼叫 Python 指令碼,然後將指令碼輸出傳遞給客戶端並在客戶端呈現輸出,從而與 Python 指令碼進行互動。

因此,讓我們建立一個 Nodejs 指令碼,在其中我們將嘗試使用 spawn() 方法建立一個子程序。

server.js

const path = require('path')
const {spawn} = require('child_process')
/**
   * Run python myscript, pass in `-u` to not buffer console output
   * @return {ChildProcess}
*/
function runScript(){
   return spawn('python', [
      "-u",
      path.join(__dirname, 'myscript.py'),
     "--foo", "some value for foo",
   ]);
}
const subprocess = runScript()
// print output of script
subprocess.stdout.on('data', (data) => {
   console.log(`data:${data}`);
});
subprocess.stderr.on('data', (data) => {
   console.log(`error:${data}`);
});
subprocess.stderr.on('close', () => {
   console.log("Closed");
});

上述指令碼將透過 .on('data', callback) 輸出結果。為了防止 Python 緩衝輸出,請使用 -f 標誌,否則 data 事件將不會列印程式的 print() 語句,直到執行結束。

>node server.js
data:Start : Wed Feb 20 10:56:11 2019
data:Foo is
data:some value for foo
data:End : Wed Feb 20 10:56:15 2019
Closed

更新於: 2019年7月30日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.