在node中如何調(diào)用python腳本
node調(diào)用python腳本
使用場景
在某測試項(xiàng)目需要用到eload儀器為待測產(chǎn)品添加載荷,然后用dmm儀器測量電壓,eload儀器與dmm儀器與電腦的連接都是usb接口,那么軟件如何控制這兩個(gè)usb連接的儀器呢。
通過搜索發(fā)現(xiàn)npm上有一個(gè)usb的依賴包,它可以查詢到與電腦相連接的usb設(shè)備,但是我無法向usb設(shè)備發(fā)送命令。
所以我只能通過python腳本向usb設(shè)備發(fā)命令,然后在node中再調(diào)用python腳本。
1、準(zhǔn)備運(yùn)行環(huán)境,獲取python路徑
python的運(yùn)行需要有python的環(huán)境,軟件安裝包可能安裝在沒有python環(huán)境的電腦上。所以我們在nw中將python(python-pro文件夾)包括進(jìn)去,打包時(shí)一起打包出來(打包時(shí)會(huì)將nw包中的東西一起打包)。
將要調(diào)用的python腳本文件放到python-pro文件夾下。
if(global.hasOwnProperty('nw')){ ? fs = nw.require('fs'); ? path= nw.require('path'); ? dirpath = path.dirname(process.execPath) ? pythonPro = dirpath+'/python-pro/' }
process.execPath為當(dāng)前啟動(dòng) Node.js 進(jìn)程的可執(zhí)行文件的絕對(duì)路徑,包含執(zhí)行文件名及其后綴,例如‘E:\Nw-package\nwjs-sdk-v0.39.0-win-x64\nw37.exe’,
path.dirname方法會(huì)返回 path 的目錄名(路徑中去除最后的執(zhí)行文件名),上述絕對(duì)路徑會(huì)返回‘E:\Nw-package\nwjs-sdk-v0.39.0-win-x64’
pythonPro = dirpath+’/python-pro/’,就找到了python所在的文件夾。
2、前端把命令字符串和python路徑傳給后端
封裝調(diào)用方法
async operate_usb(usbName,act,command,...args){ ? ? ? ? let cmd= "\""+usbName +"\""+ " "+"\""+ act+"\"" + " " +"\""+ command+"\""; ? ? ? ? args.forEach(item=>{ ? ? ? ? ? ? cmd=cmd+" "+item; ? ? ? ? }) ? ? ? ? let res = await CommandUtils.callCmd_usb(pythonPro, cmd); ? ? ? ? console.log(command+'請(qǐng)求結(jié)果:',res); ? ? ? ? return res ? ? ? },
拼接命令字符串,調(diào)用時(shí)需要傳入命令,根據(jù)python接口格式拼接好命令。
注意命令要用ml中參數(shù)要用空格隔開,參數(shù)要用雙引號(hào)包起來(不能用單引號(hào))然后又通過Meteor.call調(diào)用服務(wù)端注冊的方法調(diào)用。
把python路徑、命令字符串傳過去。
3、服務(wù)端調(diào)用python腳本
1、再次拼接命令字符串
?let cmdStr="python "+"call_instrument.py " + cmd;
- 第一個(gè)字符串"python "調(diào)用的命令行的開頭,是用命令行調(diào)用python腳本的固定寫法
- 第二個(gè)字符串"call_instrument.py "是調(diào)用的python腳本文件名稱
- 第三個(gè)參數(shù)是前端傳過來的命令
- 字符串之間用空格隔開
2、調(diào)用
path = path.split('/').join("\\") return new Promise((resolve, reject) => { ? ? exec(cmdStr,{ ? ? ? cwd:path, ? ? }, function (error, stdout, stderr) { ? ? ? if (error) { ? ? ? ? console.error('cmdFunc_usb error: ' + error); ? ? ? ? resolve(error) ? ? ? ? return; ? ? ? } ? ? ? console.log('receive: ' + stdout); ? ? ? resolve(stdout); ? ? }); ? })
通過exec()方法調(diào)用,
- 第一個(gè)參數(shù)是運(yùn)行的命令
- 第二個(gè)參數(shù)是配置對(duì)象,cwd是執(zhí)行的路徑
- 第三個(gè)是回調(diào)函數(shù),進(jìn)程終止時(shí)調(diào)用,stdout是返回結(jié)果
nodejs調(diào)用python輸出中文亂碼
nodejs調(diào)用python3腳本輸出中文亂碼的問題
問題如圖
代碼如圖
解決方法如下
在源代碼中添加
如果你未引入sys,請(qǐng)同時(shí)引入sys
結(jié)果如下
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
async/await優(yōu)雅的錯(cuò)誤處理方法總結(jié)
這篇文章主要給大家介紹了關(guān)于async/await優(yōu)雅的錯(cuò)誤處理方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01解決npm?i?報(bào)錯(cuò)以及python安裝卡住的問題
這篇文章主要介紹了解決npm?i?報(bào)錯(cuò)以及python安裝卡住的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10詳解Puppeteer前端自動(dòng)化測試實(shí)踐
這篇文章主要介紹了詳解Puppeteer前端自動(dòng)化測試實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02npm報(bào)錯(cuò):無法將"npm"項(xiàng)識(shí)別為cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱
這篇文章主要給大家介紹了關(guān)于npm報(bào)錯(cuò):無法將"npm"項(xiàng)識(shí)別為cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱的相關(guān)資料,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02手把手教你把nodejs部署到linux上跑出hello world
本篇文章主要介紹了手把手教你把nodejs部署到linux上跑出hello world,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié)
本文主要介紹了Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03