gpt4 book ai didi

node.js - 无法为特定应用程序从 Spawn 传输标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 00:21:46 27 4
gpt4 key购买 nike

我有两个脚本 A.js 和 B.js,以及一个第三方应用程序(开源)。脚本 A.js 使用 execSync 启动第 3 方应用程序。脚本 B.js 使用 spawn 启动脚本 A.js。

如果我单独运行脚本 A.js,我可以看到第 3 方应用程序的完整输出。当我通过运行脚本 B.js 间接运行它时,我只能看到一些输出。

A.js

const { execSync } = require('child_process');
console.log("Hello");
execSync('mybinary.exe -arg1 -arg2', { stdio: 'inherit' });

B.js

const { spawn } = require('child_process');
const app = spawn(process.execPath, ['A.js'], {
stdio: ['inherit', null, 'inherit']
});

app.stdout.on('data', (chunk) => {
process.stdout.write(chunk);
});

当我启动 B 时,我只看到“Hello”,但是二进制文件正在运行(它是一个服务器,我可以打开到它的 TCP 连接)。我只是没有看到输出。当我单独启动 A 时,我会看到“Hello”和常规二进制文件的输出。

如果我将 B 的标准输出更改为“继承”,它就会起作用。

为什么会发生这种情况,如何解决这个问题?

更新:似乎与使用两个脚本没有任何关系。不使用 stdio 继承直接生成二进制文件也会出现同样的问题。似乎依赖于第三方应用程序。 如果程序只是打印到标准输出,它如何影响 Node ?

上下文:我想启动服务器,然后在服务器准备就绪时运行命令。准备好后,服务器会打印出特定的消息。我们的想法是等待该消息被打印。打印出此消息后,它不会打印任何其他内容,但它会保持运行状态。

我尝试通过管道传输的特定可执行文件是 ChatScript server .

更新:此时,我认为它与我尝试通过管道传输的特定二进制文件有关。我想了解二进制文件如何影响此行为,即使用继承而不是管道。 如果有人可以使用 Node 脚本(或 C 程序)重新创建此行为,那就可以回答这个问题。

<小时/>

环境

  • 操作系统:Windows 10
  • 控制台:Cygwin(还尝试了常规命令提示符)。
  • Node v7.10.0

请注意,这与此处的问题相同:node.js child_process.spawn no stdout unless 'inherit'

最佳答案

chatscript 正在执行的写入操作是“fprintf( stdout, ...)”,这是一个缓冲输出,并且会保存到类似 (4k?) 的缓冲然后刷新。例如,在 ChatScript/src/os.cpp 第 1849 行中的 fprintf( stdout ) 之后添加 'fflush(stdout)' ...然后输出就可以工作(某种程度上,需要进一步的更改,但我至少在 cs_init.d 中得到了 'fflush(stdout)' 。 txt' 错误现在正在记录。

另一个测试是将 chatscript.exe 重定向到一个文件并查看该文件获取的内容。 'chatscript > zz',然后用 ctrl-c 结束聊天脚本,您会看到 zz 也为空白...这表明 IO 已被缓冲并且未正确刷新到输出。

M:\javascript\test_exec>node b.js
Hello

in cs_init.txt at 0:
A subdirectory or file USERS already exists.
Error opening utf8writeappend file LOGS/startlog.txt: No such file or directory
ChatScript Release Version 7.5 pid: 0 32 bit Windows compiled Jun 24 2017 09:42:13 host=local
Params: dict:2097151 fact:800000 text:100000kb hash:215127
buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000 loglimit:80000
Unable to read dictionarySystem.h
Missing 37 word files
read 0 raw words

in facts.txt at 0:
A subdirectory or file USERS already exists.

关于node.js - 无法为特定应用程序从 Spawn 传输标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44344448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com