1. 程式人生 > >nodejs(javascript)執行python指令碼

nodejs(javascript)執行python指令碼

現在有需求對python指令碼進行本地化執行,我就自己寫了個包,供大家使用,可以互相學習

目標

  • 專案的目標是讓nodejs可以正常並無縫使用 python指令碼
  • 同時支援回撥函式的傳遞
  • 通過非同步方式在本地伺服器後端執行python指令碼/ipynb格式的檔案/以及python字串

1.機制

充分利用node的非同步載入的能力,通過child_pross中的spawn機制(非同步的非同步),
基於promise封裝執行並輸出正常或錯誤的列印記錄,實現實時檢測python的處理結果

2.可以執行

  1. python字串,即符合標準的python指令碼,呼叫 runpytext
  2. 支援 .py檔案 runpath
  3. 支援 .ipynb (jupyter格式的檔案) run_ipynb_code
注意:.ipynb根據官方說明,由於其儲存的是一種json格式,也就是說暫時還無法直接執行
程式,故在執行.ipynb程式的時候需要通過官方的jupyter nbconvert 方式對.ipynb進行格
式的轉換/目前是存於tmp臨時檔案中(支援window以及linux系統),再通過正常機制
(runpath)處理python指令碼

3.錯誤處理機制

當python執行處理出錯會丟擲異常,可以通過回撥函式捕捉異常

4.使用方法 安裝專案包方法

    $ npm install --save jsexecpy 

使用方式

    1. 字串功能
    > let jsexecpy = require("jsexecpy")
    > jsexecpy.runpytext("import os;import time;time.sleep(1);print('you are my love');time.sleep(5);a = 2;a+=1;print(a)")
    
    1. 執行.py檔案
    > let jsexecpy = require("jsexecpy")
    > jsexecpy.runpath("/home/.../test.py",callback)
    
    1. 執行.ipynb檔案
    > let jsexecpy = require("jsexecpy")
    > jsexecpy.run_ipynb_code("/home/.../test.ipynb",callback)
    
    
    1. callback 寫法
      callback返回的是{data,pythonpath} ,即列印日誌資料,以及執行指令碼的路徑
     > let callback = function({data,pythonpath},otherargs = 11,...){
         dosomething(data,pythonpath,otherargs)
     }
     > jsexecpy.runpath("path.py",callback)
     > jsexecpy.run_ipynb_code("path.ipynb",callback)
    
    1. python檔案傳參更新
      python some.py a b c -p=a --list=bb
      傳參有兩種方式
    • a) string type
     > let params = "a b c -p=a --list=bb"
     > jsexecpy.runpath_with_params("some.py",params,callback)
    
    • b) array type
     > let paramslist = ["a","b" ,"c", "-p=a", "--list=bb"]
     > jsexecpy.runpath_with_params("some.py",paramslist,callback)