如何将 STDIN 传递给 node.js 子进程

问题描述 投票:0回答:5

我正在使用一个为节点包装

pandoc
的库。但我不知道如何将 STDIN 传递给子进程`execFile ...

var execFile = require('child_process').execFile;
var optipng = require('pandoc-bin').path;

// STDIN SHOULD GO HERE!
execFile(optipng, ['--from=markdown', '--to=html'], function (err, stdout, stderr) {
    console.log(err);
    console.log(stdout);
    console.log(stderr);
});

在 CLI 上它看起来像这样:

echo "# Hello World" | pandoc -f markdown -t html

更新 1

试图让它与

spawn
一起工作:

var cp = require('child_process');
var optipng = require('pandoc-bin').path;
var child = cp.spawn(optipng, ['--from=markdown', '--to=html'], { stdio: [ 0, 'pipe', 'pipe' ] });

child.stdin.write('# HELLO');
// then what?
node.js command-line-interface
5个回答
18
投票

spawn()
一样,
execFile()
也返回一个
ChildProcess
实例,它有一个
stdin
可写流。

作为使用

write()
和监听
data
事件的替代方法,您可以创建一个可读流
push()
您的输入数据,然后
pipe()
它到
 child.stdin
:

var execFile = require('child_process').execFile;
var stream   = require('stream');
var optipng  = require('pandoc-bin').path;

var child = execFile(optipng, ['--from=markdown', '--to=html'], function (err, stdout, stderr) {
    console.log(err);
    console.log(stdout);
    console.log(stderr);
});

var input = '# HELLO';

var stdinStream = new stream.Readable();
stdinStream.push(input);  // Add data to the internal queue for users of the stream to consume
stdinStream.push(null);   // Signals the end of the stream (EOF)
stdinStream.pipe(child.stdin);

15
投票

这是我如何让它工作的:

var cp = require('child_process');
var optipng = require('pandoc-bin').path; //This is a path to a command
var child = cp.spawn(optipng, ['--from=markdown', '--to=html']); //the array is the arguments

child.stdin.write('# HELLO'); //my command takes a markdown string...

child.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});
child.stdin.end();

11
投票

作为标准输入的字符串

如果您使用同步方法(

execFileSync
execSync
spawnSync
),您可以使用选项中的 input 键将
string 作为 stdin
传递。像这样:

const child_process = require("child_process");
const str = "some string";
const result = child_process.spawnSync("somecommand", ["arg1", "arg2"], { input: str });

1
投票

根据这些

docs
和以下摘录,我不确定是否可以将
STDIN
child_process.execFile()一起使用,看起来它仅适用于
child_process.spawn()

child_process.execFile() 函数与 child_process.exec() 类似,只是它不生成 shell。相反,指定的可执行文件直接作为一个新进程产生,使其比 child_process.exec() 稍微高效一些。


0
投票

stdin 可以通过

exec
实例传递到
execFile
ChildProcess
中。

const { exec } = require('node:child_process');

const child = exec('cat', (error, stdout, stderr) => {
    if (error) {
        throw error;
    }
    console.log(stdout);
});

child.stdin.write('foo');
child.stdin.end();

参考:https://github.com/nodejs/node/issues/25231

© www.soinside.com 2019 - 2024. All rights reserved.