Node.js дочерний процесс к процессу Python - PullRequest
0 голосов
/ 15 февраля 2019

Я должен отправить текст из дочернего процесса 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:

1 Ответ

0 голосов
/ 16 февраля 2019

Вам нужно будет позвонить child.stdin.end() в программе Node после последнего вызова child.stdin.write().До тех пор, пока не будет вызван end(), записываемый поток child.stdin будет хранить записанные данные в буфере, поэтому программа Python не увидит его.Подробности см. В обсуждении Буферизация в https://nodejs.org/docs/latest-v8.x/api/stream.html#stream_buffering.

(Если вы записываете много данных в stdin, буфер записи в конечном итоге заполнится до точки, где накопилисьданные будут автоматически сброшены в программу Python. Затем буфер снова начнет собирать данные. Требуется end() вызов, чтобы убедиться, что окончательная часть записанных данных сбрасывается. Это также имеет эффект указаниядочернему процессу, что в этом потоке больше не будет отправлено данных.)

...