我在 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();
有谁知道如何解决吗?
您可以将父进程的任何标准 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
).
stdout
,
stderr
,以及
stdin
)每个都有对应的
readable
或
writable
属性是一个实例
网络标准流。
这些流的主题有一个 Stack Overflow 标签:whatwg-streams-api
做一些事情,例如将父母
stdin
连接到孩子,以及
在程序代码中直接写入孩子stdin
,您需要使用
额外的第三方代码来合并这些输入流,例如这个模块
Deno 的 std
库:
https://deno.land/[email protected]/streams/merge_readable_streams.ts