在node中调用python脚本

使用场景:
在某测试项目需要用到eload仪器为待测产品添加载荷,然后用dmm仪器测量电压,eload仪器与dmm仪器与电脑的连接都是usb接口,那么软件如何控制这两个usb连接的仪器呢。
通过搜索发现npm上有一个usb的依赖包,它可以查询到与电脑相连接的usb设备,但是我无法向usb设备发送命令。
所以我只能通过python脚本向usb设备发命令,然后在node中再调用python脚本。

1、准备运行环境,获取python路径

python的运行需要有python的环境,软件安装包可能安装在没有python环境的电脑上。所以我们在nw中将python(python-pro文件夹)包括进去,打包时一起打包出来(打包时会将nw包中的东西一起打包)。
将要调用的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为当前启动 Node.js 进程的可执行文件的绝对路径,包含执行文件名及其后缀,例如‘E:\Nw-package\nwjs-sdk-v0.39.0-win-x64\nw37.exe’,
  • path.dirname方法会返回 path 的目录名(路径中去除最后的执行文件名),上述绝对路径会返回‘E:\Nw-package\nwjs-sdk-v0.39.0-win-x64’
  • pythonPro = dirpath+’/python-pro/’,就找到了python所在的文件夹。

2、前端把命令字符串和python路径传给后端

封装调用方法

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+'请求结果:',res);
        return res  
    },
  • 拼接命令字符串,调用时需要传入命令,根据python接口格式拼接好命令。注意命令要用ml中参数要用空格隔开,参数要用双引号包起来(不能用单引号)
  • 然后又通过Meteor.call调用服务端注册的方法调用。把python路径、命令字符串传过去。

3、服务端调用python脚本

1、再次拼接命令字符串

 let cmdStr="python "+"call_instrument.py " + cmd;
  • 第一个字符串"python "调用的命令行的开头,是用命令行调用python脚本的固定写法
  • 第二个字符串"call_instrument.py "是调用的python脚本文件名称
  • 第三个参数是前端传过来的命令
  • 字符串之间用空格隔开

2、调用

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()方法调用,
exec的文档

  • 第一个参数是运行的命令
  • 第二个参数是配置对象,cwd是执行的路径
  • 第三个是回调函数,进程终止时调用,stdout是返回结果
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值