Node.js 子进程到 Python 进程

我必须将文本从 node.js 子进程发送到 python 进程。我的虚拟节点客户端看起来像


var resolve = require('path').resolve;

var spawn = require('child_process').spawn;


data = "lorem ipsum"


var child = spawn('master.py', []);


var res = '';

child.stdout.on('data', function (_data) {

    try {

        var data = Buffer.from(_data, 'utf-8').toString();

        res += data;

    } catch (error) {

        console.error(error);

    }

});

child.stdout.on('exit', function (_) {

    console.log("EXIT:", res);

});

child.stdout.on('end', function (_) {

    console.log("END:", res);

});

child.on('error', function (error) {

    console.error(error);

});


child.stdout.pipe(process.stdout);


child.stdin.setEncoding('utf-8');

child.stdin.write(data + '\r\n');

而 Python 进程master.py是


#!/usr/bin/env python


import sys

import codecs


if sys.version_info[0] >= 3:

    ifp = codecs.getreader('utf8')(sys.stdin.buffer)

else:

    ifp = codecs.getreader('utf8')(sys.stdin)


if sys.version_info[0] >= 3:

    ofp = codecs.getwriter('utf8')(sys.stdout.buffer)

else:

    ofp = codecs.getwriter('utf8')(sys.stdout)


for line in ifp:

    tline = "<<<<<" + line + ">>>>>"

    ofp.write(tline)


# close files

ifp.close()

ofp.close()

我必须用一个utf-8编码输入的读者,所以我使用sys.stdin,但似乎Node.js的写入子进程的时候stdin使用child.stdin.write(data + '\r\n');,这样不会被读取sys.stdin的for line in ifp:


守着星空守着你
浏览 183回答 1
1回答

三国纷争

您需要child.stdin.end()在最终调用child.stdin.write().&nbsp;在end()调用之前,child.stdin可写流会将写入的数据保存在缓冲区中,因此 Python 程序不会看到它。有关详细信息,请参阅https://nodejs.org/docs/latest-v8.x/api/stream.html#stream_buffering 中的缓冲讨论。(如果您写入大量数据,stdin则写入缓冲区最终将填充到累积数据将自动刷新到 Python 程序的点。然后缓冲区将再次开始收集数据。end()需要调用以确保写入的数据的最后一部分被刷新。它也具有指示子进程不会在此流上发送更多数据的效果。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python