nodejs(javascript)執行python指令碼
阿新 • • 發佈:2019-01-06
現在有需求對python指令碼進行本地化執行,我就自己寫了個包,供大家使用,可以互相學習
目標
- 專案的目標是讓nodejs可以正常並無縫使用 python指令碼
- 同時支援回撥函式的傳遞
- 通過非同步方式在本地伺服器後端執行python指令碼/ipynb格式的檔案/以及python字串
1.機制
充分利用node的非同步載入的能力,通過child_pross中的spawn機制(非同步的非同步),
基於promise封裝執行並輸出正常或錯誤的列印記錄,實現實時檢測python的處理結果
2.可以執行
- python字串,即符合標準的python指令碼,呼叫 runpytext
- 支援 .py檔案 runpath
- 支援 .ipynb (jupyter格式的檔案) run_ipynb_code
注意:.ipynb根據官方說明,由於其儲存的是一種json格式,也就是說暫時還無法直接執行
程式,故在執行.ipynb程式的時候需要通過官方的jupyter nbconvert 方式對.ipynb進行格
式的轉換/目前是存於tmp臨時檔案中(支援window以及linux系統),再通過正常機制
(runpath)處理python指令碼
3.錯誤處理機制
當python執行處理出錯會丟擲異常,可以通過回撥函式捕捉異常
4.使用方法 安裝專案包方法
$ npm install --save jsexecpy
使用方式
-
- 字串功能
> 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)")
-
- 執行.py檔案
> let jsexecpy = require("jsexecpy") > jsexecpy.runpath("/home/.../test.py",callback)
-
- 執行.ipynb檔案
> let jsexecpy = require("jsexecpy") > jsexecpy.run_ipynb_code("/home/.../test.ipynb",callback)
-
- 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)
- callback 寫法
-
- 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)
- python檔案傳參更新