Node.js 将文本作为 `spawnSync` 的标准输入传递

Posted

技术标签:

【中文标题】Node.js 将文本作为 `spawnSync` 的标准输入传递【英文标题】:Node.js pass text as stdin of `spawnSync` 【发布时间】:2017-12-07 01:54:45 【问题描述】:

我认为这很简单,但以下内容无法按预期工作。

我想将数据从 Node 传送到一个进程,例如(只是一个任意命令)wc

docs 和其他 SO questions 似乎表明传递 Stream 应该可以工作:

const spawnSync = require('child_process')
const Readable = require('stream')

const textStream = new Readable()
textStream.push("one two three")
textStream.push(null)

const stdio = [textStream, process.stdout, process.stderr]
spawnSync('wc', ["-c"],  stdio )

不幸的是,这会引发错误:

选项“stdio”的值“Readable ... 无效

relevant bit of code from internal/child_process.js 不会立即透露预期的有效选项是什么。

【问题讨论】:

这很有趣!我只是通过将数据直接传递给input 选项而不是重新分配stdin 来使其工作。 “请注意,流必须具有底层描述符”。我不认为你的textStream 有一个。 谢谢@robertklep——我也注意到了;从我读过的所有内容来看,不清楚为什么需要描述符,它是如何实现/与常规流区分开来的,或者在任何情况下如何解决它。这是一个奇怪的、看似武断的要求。 这不是任意的,因为这就是管道(基本上是您要构建的)的工作方式:它们连接文件描述符。但是,将数据管道传输到进程和spawnSync 的组合也没有任何意义,因为外部程序是同步执行的(因此在它开始和结束之间你不能通过管道传输任何东西)。也许您想使用input 选项? 谢谢@robertklep——input 选项在这里看起来是正确的答案。另外:正确的解决方案应该是恕我直言,stdio[0] 应该在抽象流接口的任何兼容实现上都有效;无论是来自套接字、文件、管道还是任何其他可读接口; spawn 的同步性是一个 wait 用于 spawn 退出 - 但这不会抑制生成的进程,例如从标准输入永远读取。对带有描述符的流的限制似乎是一个任意的技术警告,而不是服务于合理目标的原则性设计选择。可能是错的:) 【参考方案1】:

要将特定数据显示为子进程的stdin 数据,您可以使用input 选项:

spawnSync('wc', ['-c'],  input : 'one two three' )

【讨论】:

以上是关于Node.js 将文本作为 `spawnSync` 的标准输入传递的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node.js 从文本文件中解析街道地址

如何在 Node JS 中读取文本文件并将其作为 JSON 对象返回?

如何从 Node.js IMAP 模块中的正文获取纯文本

如何将 node.js 模块作为 node.js 程序的子进程执行?

JS 语音合成到 Node.JS 可读流

node.js:将文本文件读入数组。 (每一行都是数组中的一个项目。)