如何连接父子进程的stdin流?

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

我在 deno 版本中编写标准输入时遇到问题

1.37.0 (release, x86_64-pc-windows-msvc)
。我在文档中搜索,谷歌,尝试代码但不起作用。我在https://github.com/denoland/deno/issues/7713找到了相关代码,但与最新版本不兼容。

我有这样的代码:

// parent.ts
const command = new Deno.Command(Deno.execPath(), {
  args: [
    "run",
    "-A",
    "child.ts"
  ],
  stdout: "piped",
  stdin: "piped"
});

const p = command.spawn();
// child.ts
const decoder = new TextDecoder();
for await (const chunk of Deno.stdin.readable) {
  const text = decoder.decode(chunk);
  console.log(text);
}

Deno.stdin.close();

有谁知道如何解决吗?

subprocess stdin deno
1个回答
0
投票

您可以将父进程的任何标准 I/O 流连接到 子进程通过使用 值

"inherit"
选项对应于 该流 (
stdout
stderr
stdin
) — 例如:

./parent.ts

const childProcess = new Deno.Command(Deno.execPath(), {
  args: ["run", import.meta.resolve("./child.ts")],
  stderr: "inherit", // Connect stderr of child to stderr of this process
  stdin: "inherit", // Connect stdin of child to stdin of this process
  stdout: "inherit", // Connect stdout of child to stdout of this process
}).spawn();

await childProcess.status;

事实上——当生成一个 Deno 中的子进程 v

1.37.0
"inherit"
是默认值 这些的选项值 流,因此您不需要需要指定它。 (但我建议这样做,以防万一 默认值会改变——默认值在过去已经改变了!)

为了重现这个例子,以下是

./child.ts
的内容:

// Raw mode needs to be enabled for this example — you can read more about it in Deno's API documentation:
Deno.stdin.setRaw(true, { cbreak: true });

for await (
  const str of Deno.stdin.readable.pipeThrough(new TextDecoderStream())
) {
  const timestamp = new Date().toISOString();
  console.log(timestamp, str);
}

现在,您可以使用以下命令在终端中运行父进程:

deno run --allow-read --allow-run=deno parent.ts

当您在终端(的

stdin
)中输入内容时,数据流将是 转发给子进程。示例子模块使用
console.log
(其中 将值写入
stdout
,后跟换行符)。因为上面的代码也 指定连接子进程和父进程的
stdout
流,您 应该在您的新行中看到您的每个输入前面都有一个时间戳 终端。

例如,如果您输入 H e l l o W o r l d 进入你的终端,然后你会看到与此非常相似的输出:

2023-09-26T01:03:35.640Z H
2023-09-26T01:03:35.852Z e
2023-09-26T01:03:35.892Z l
2023-09-26T01:03:36.023Z l
2023-09-26T01:03:36.273Z o
2023-09-26T01:03:36.700Z  
2023-09-26T01:03:36.936Z W
2023-09-26T01:03:37.097Z o
2023-09-26T01:03:37.152Z r
2023-09-26T01:03:37.276Z l
2023-09-26T01:03:37.365Z d

要停止 Deno 父进程,请使用 Ctrl + c 发送 中断信号(

SIGINT
).


在 Deno 中,标准 I/O 流 (

stdout
,
stderr
,以及
stdin
)每个都有对应的
readable
writable
属性是一个实例 网络标准流

这些流的主题有一个 Stack Overflow 标签:


做一些事情,例如将父母

stdin
连接到孩子,以及 在程序代码中直接写入孩子
stdin
,您需要使用 额外的第三方代码来合并这些输入流,例如这个模块 Deno 的
std
库:
https://deno.land/[email protected]/streams/merge_readable_streams.ts

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