在第一个结束后如何在 Node.js 中生成一个新的 Python 子进程?

如何解决在第一个结束后如何在 Node.js 中生成一个新的 Python 子进程?

我在 node.js 应用程序中使用 Python 脚本的输出。

但是,我需要再次查询(并且可能多次)。

我无法执行此操作,因为 Python 进程已结束且无法重新启动。我试图重新分配变量,但它不起作用。如何再次启动 Python 脚本?这是我的代码:

var spawn = require('child_process').spawn,interval_data = [1,2,4,5,6,7],interval_dataString = '';

var py = undefined

startPython()

py.stdout.on('data',function(data){
  interval_dataString += data.toString();
  console.log(interval_dataString)
});
  

py.stdout.on('end',function(){

  console.log('Alpha Component =',interval_dataString);
  
  setTimeout(() => {
    startPython()
  },1000)

});


function startPython() {
  py = undefined
  py = spawn('python',['dfa.py'])
  py.stdin.write(JSON.stringify(interval_data));
  py.stdin.end();
}

这是 Python 代码:

## compute_input.py

import sys,json,numpy as np

#Read data from stdin
def read_in():
    
    lines = sys.stdin.readlines()
    #Since our input would only be having one line,parse our JSON data from that
    
    return json.loads(lines[0])
    
    #lines = "[1,2]" # for testing
    #return json.loads(lines) # for testing

def main():
    #get our data as an array from read_in()
    lines = read_in()

    #create a numpy array
    np_lines = np.array(lines)

    #use numpys sum method to find sum of all elements in the array
    lines_sum = np.sum(np_lines)

    #return the sum to the output stream
    print(lines_sum)

#start process
if __name__ == '__main__':
    main()

解决方法

您覆盖了子进程。 所以你不能再使用原来的对象(事件发射器)。

它可能比你更简单:)

只需在“开始”函数中调用/移动事件发射器即可。 因此,每次生成子对象时,都会使用新的子对象/事件发射器。

const { spawn } = require("child_process");

const interval_data = [1,2,4,5,6,7]
const interval_response = [];

// use this as exit strategie
var should_restart = true;


function start() {

    // spawn python child
    let child = spawn("python3",["dfa.py"]);

    // would be better to work on buffer objects
    // create on final child/python exit a string out of the buffer
    child.stdout.on("data",(data) => {
        interval_response.push(data.toString());
    });

    // listen for the close event
    child.on("close",() => {
        if (should_restart) {

            // feedback
            console.log("Alpha Component =",interval_response.join());

            setTimeout(() => {
                start();
            },1000)

        } else {

            // nope,not now!
            console.log("DIE!",interval_response);
        
            // Do what ever you want with the result here

        }
    });

    // write stuff to python child process
    child.stdin.write(JSON.stringify(interval_data));

}

start();


// let the programm run for min. 5sec
setTimeout(() => {
    should_restart = false;
},5000);

已使用您的 Python 代码进行测试。

node index.js
Alpha Component = 3

Alpha Component = 3,3

Alpha Component = 3,3,3

DIE! [ '3\n','3\n','3\n' ]

我以为你实际上是从 stdin 读入你的 python 脚本的。 (而且不仅仅是一个虚拟函数)

但是对于节点部分应该没有任何区别。

在 Ubuntu 18.04 x64 上测试,节点:v13.14.0,python:3.6.9。

编辑

基于您的 Python 代码段创建,该脚本从 stdin 读取并创建所有传递数字的总和:

import sys,json

def main():

    data = sys.stdin.read()
    data = json.loads(data)

    #print("debug:",data)

    chunks_sum = sum(data)

    #print("debug",chunks_sum)

    sys.stdout.write(str(chunks_sum))

#start process
if __name__ == '__main__':
    main()

修改启动函数:

function start() {

    // spawn python child
    let child = spawn("python3",(data) => {

        // since your python code just create
        // a sum of all numbers,store the 
        // returend stuff as number
        interval_response.push(Number(data));

    });

    // listen for the close event
    child.on("close",interval_response);

            setTimeout(() => {
                start();
            },interval_response);

            // create sum of all sum chunks from python
            // not sure what you want to do with the "interval_response" array
            // just for demo purpose
            let sum = interval_response.reduce((pv,cv) => pv + cv,0);

            console.log("Total sum",sum);

        }
    });

    // write stuff to python child process
    //child.stdin.write();

    child.stdin.end(JSON.stringify(interval_data));

}

child.stdin.write 更改为 child.stdin.end,python 现在也可以“启动”并且不需要等待更多数据。

注意:我不知道 IPC/stdio“缓冲”是如何工作的。如果您处理大数据,也许您会发现一些可疑的东西。

此外,我们将写入“stdout”的python数据存储为数组interval_response中的数字,因为您只需计算我们写入“stdin”的数据总和。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res