現在有需求對python腳本進行本地化執行,我就自己寫了個包,供大家使用,可以互相學習
jsexecpy 的github地址
目標
項目的目標是讓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)
python文件傳參更新
python some.py a b c -p=a --list=bb
傳參有兩種方式
> let params = "a b c -p=a --list=bb"
> jsexecpy.runpath_with_params("some.py",params,callback)
> let paramslist = ["a","b" ,"c", "-p=a", "--list=bb"]
> jsexecpy.runpath_with_params("some.py",paramslist,callback)