Node环境中调用Python脚本

news2025/1/13 17:10:18

今天遇到一个需要在Node服务中调用Python脚本的需求,这里就把这个场景单独抽离出来汇总一下方法
在node中的child_process中有execSync, exec两个方法来创建一个子进程,然后在子进程里执行对应的python命令,这两个命令可以让我们执行一个脚本命令。

exec && execSync

事先准备两个文件,一个node脚本(实际使用时,可以是Node服务中的脚本)
一个是需要被调用的python文件。

// 已近在本地安装好python3 环境
const { execSync, exec } = require('child_process')

// 在node脚本中运行python脚本-同步
const runPythonInNodeEnvSync = () => {
  // ${process.cwd()} 获取当前脚本运行目录
  const path = `${process.cwd()}/demo.py`;
  const data = execSync(`python3 ${path}`);
  console.log(`同步调用python脚本:${data.toString()}`);
}

// 在node脚本中运行python脚本-异步
const runPythonInNodeEnvAsync = () => {
  // ${process.cwd()} 获取当前脚本运行目录
  const path = `python3 ${process.cwd()}/demo.py`;
  exec(path, function(error,stdout,stderr){
    if(error) {
        console.info('stderr : '+stderr);
    }
    console.log(`异步调用python脚本:${stdout}`);
  })
}

runPythonInNodeEnvSync()
runPythonInNodeEnvAsync()

def fn():
    str = 'this is data come from python file'
    print(str)
    return str

val = fn() 

在这里插入图片描述

spawn


const { spawn } = require('child_process')


// 使用spawn来验证
const spawnFn = () => {
  const path = `${process.cwd()}/demo.py`;
  const py = spawn('python3', [path])
  
  py.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
  });

  py.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
  });

  py.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  }); 
}


spawnFn()

在这里插入图片描述

传递参数


const { spawn } = require('child_process')


// 使用spawn来验证
const spawnFn = () => {
  const path = `${process.cwd()}/demo.py`;
  const params = 'this is params'
  const py = spawn('python3', [path, params])
  
  py.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
  });

  py.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
  });

  py.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  }); 
}
spawnFn()

对应的python脚本也需要做一下修改


import sys

def fn():
    str = 'this is data come from python file'
    return str

def fn2():
    params = sys.argv[1]
    print(f"python中接受到的参数为: {params}")

val = fn2()
    

执行效果如下所示
在这里插入图片描述

参考文件

Node中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯专题-试题版-【完美的代价】【芯片测试】【序列求和】【杨辉三角形】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Jmeter分布式压测配置

目录 前置条件 环境部署并使用 前置条件 电脑A,电脑B,电脑C均安装相同版本的JMeter 和JDK。其中电脑A作为控制机,电脑B和电脑C作为施压机 电脑A IP:172.16.0.114 电脑B IP:172.16.0.115 电脑C IP:172…

PLC通讯协议【三菱】FX协议的报文格式和读写示例

通过编程口通讯协议,具体可操作的软元件有:X/Y/M/S/T/C/D。 通讯设置 必须设置为:波特率9600,偶校验,7位数据位,1停止位。否则无法通讯。 一、报文结构 注意: 通讯协议中的所有字符是用它们的十六进制ASCII码表示。如果有十进制数据,要先转化为十六进制数,再把十六进制…

数据挖掘算法常用四大类

一、常用算法有哪四大类 既然我们知道数据挖掘的算法是为了寻找数据中潜在的知识,那么数据挖掘的算法通常都有哪些类型呢?如果说按照这些算法所解决的问题来进行划分,大致可以分为分类问题、聚类问题、回归问题和关联分析问题。下面我们就来…

chatgpt赋能python:如何使用Python读取手机短信

如何使用Python读取手机短信 在现代社会,短信已成为人们生活中不可或缺的一部分。那么,如何利用Python读取手机短信呢?本文将介绍如何使用Python读取手机短信,并提出一些相关的建议。 什么是Python Python是一种高级的、开源的…

高并发系统设计40问

01 | 高并发系统:它的通用设计方法是什么? 三种方法: Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并…

隐藏cobaltstrike服务器-nginx反向代理

隐藏nginx版本 编辑/etc/nginx/nginx.conf 取消server_tokens off 前面的注释 http转发80端口 编辑/etc/nginx/sites-enabled/default ## # You should look at the following URLs in order to grasp a solid understanding # of Nginx configuration files in order to …

【kubernetes系列】Kubernetes之RC、RS和Deployment

在实际的工作中,我们使用Kubernetes 通常不会直接创建 Pod,而是通过 各种 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kuberne…

C++之thread的简单使用示例

1、全局函数传入thread #include <iostream> #include <thread> #include <string>void threadWork(std::string content, int counts) {for (int i 0; i < counts; i) {std::cout << content << i << std::endl;} }int main() {std:…

node-sass报错

我们安装vue项目时&#xff0c;经常遇到nade-sass报错。然后切换到某个node版本后不再报错&#xff0c;原因见下文 一&#xff1a;报错内容 二&#xff1a;保存原因 本地nodejs版本跟安装的node-sass版本不一致 三&#xff1a;解决办法 1、查看本地node版本 node -v 2、查…

ECCV2020-FRELU

论文链接&#xff1a;https://arxiv.org/pdf/2007.11824.pdf 官方代码&#xff1a;GitHub - megvii-model/FunnelAct paddle复现版本&#xff1a;FReLU&#xff1a;简单高效的新型激活函数 - 飞桨AI Studio torch复现版本&#xff1a;GitHub - nekitmm/FunnelAct_Pytorch: py…

Word中论文参考文献完美对齐方法

1、首先&#xff0c;我们从知网、谷歌学术或其他网站找到我们需要引用的参考文献&#xff0c;如果你设置了自动编号&#xff0c;请先删除前面的自动编号。 2、我们手动在前面加上[1]、[2]等编号&#xff0c;注意都是英文符号&#xff0c;且没有空格。 3、我们光标放到编号后面…

【教学类-36-03】midjounery-niji表情包图片的矩阵式切割(3*3)及GIF制作过程

作品展示 背景需求&#xff1a; 学习midjounery-niji表情包制作&#xff0c;先用关键词生成了一张3*3的熊猫多种表情图矩阵式样 选第3张&#xff0c;放大&#xff0c;另存为“熊猫9张图” 需要&#xff1a; 把这张PNG图片切成9张同样大的小图&#xff0c;便于生成GIF动图。 图…

QT ObjectThread moveToThread多线程操作

QT多线程专栏共有15篇文章&#xff0c;从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等线程操…

我的项目--初始设计

PYQT 界面1. 表&#xff1a;USER ADD键&#xff1a;USER表添加一条记录 界面2&#xff1a;

【数据结构与算法】5、循环链表、约瑟夫问题、静态链表

循环链表目录 一、单向循环链表(1) add()(2) remove()(3) 单向循环链表特点 二、双向循环链表三、约瑟夫问题&#xff08;Josephus Problem&#xff09;四、静态链表 一、单向循环链表 &#x1f33f; 单向循环链表在单链表的基础上&#xff0c;尾节点的 next 指向头节点 (1) a…

欺诈无所遁形:反欺诈(羊毛盾)API 应用解析

随着互联网的快速发展&#xff0c;欺诈行为不断演变和扩大&#xff0c;涉及的领域也越来越广泛。虚假账户注册、刷单、恶意评论、虚假广告等欺诈手段成为一些不法分子获取利益的途径。这些行为不仅损害了用户的利益&#xff0c;也对在线平台的声誉和可信度造成了威胁。为了解决…

为什么推荐用易模来制作真人手办所需的人像模型?

要问最近什么手办最流行&#xff0c;真人手办必须拥有姓名。大家看腻了传统的动漫以及游戏的周边手办以后&#xff0c;想要玩出点新花样&#xff0c;于是纷纷把眼光放到真人的身上&#xff0c;真人手办开始应运而生。 现阶段制作真人手办通常都是线下来进行&#xff0c;需要消费…

Docker安装pritunl

Background Pritunl是一款图形化的OpenVPN软件&#xff0c;提供一个友好的图形WebUI界面&#xff0c;对传统OpenVPN服务端与客户端复杂的安装配置流程进行了极大的简化&#xff0c;并且通过图形界面可以进行人员管理、参数配置&#xff0c;给予用户非常大的便捷性&#xff0c;适…

【运维】Windows 通过注册表禁用服务

【运维】Windows 通过注册表禁用服务 以这个服务为例子 Windows Push Notifications User Service 双击查看服务名称 WpnUserService_671f3 打开注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{服务名称} HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Ser…