Node.js + Python子进程:打印返回数据,但返回无效

1 投票
1 回答
1291 浏览
提问于 2025-04-18 05:16

我有个基本的问题。我正在用node.js和socket.io写一些初学者的代码,在这个过程中我使用了一个python子进程,并在它返回数据时触发一些动作,比如:

io.sockets.on('connection',function(socket) {
    socket.on('load_api_call', function() {

        var pythonarray=['/Users/<omitting path>/test_return_sub_dict.py']

        var child=spawn('/Users/<omitting path>/python2.7',pythonarray)

        child.stdout.on('data',function(data){
            socket.emit('jsonSuccess',data.toString('utf8'));           
            console.log('python output: '+data);
        });

        child.stderr.on('data',function(data){
            process.stdout.write('error output: '+data);
        });

    });
});

这个运行得很好。我的问题是:当我在python子进程中打印返回的数据时,上面的“child.stdout.on('data'”会因为返回的数据而被激活。然而,当我只是“return”数据时,数据并没有被返回,或者说没有以socket能接收到的方式返回。所以举个例子,在我叫做“return sub dictionary”的子进程模块中,最后一行

return sub_dict

不会返回任何socket能注意到的东西。但是这一行:

print sub_dict

会被socket注意到,并触发后续想要的动作。

从python子进程返回数据的正确方法是什么,才能让node注意到呢?

我能看出我对Python、Node或者两者的一些基本机制没有理解,但我不知道该怎么称呼它去搜索答案。

谢谢你的建议!

1 个回答

1

这个Python脚本需要把信息输出到标准输出(stdout)或标准错误(stderr),这样Node.js才能获取到这些数据。因为这两个输出流是子进程对象在监控的。根据我所知道的,仅仅返回一个值并不会自动显示这些数据,所以你需要告诉Python手动把信息打印到标准输出或标准错误。

撰写回答