JavaScript 无法一次接收一行子流
JavaScript can't receive child stream one line at a time
在 Node 中使用 child_process.spawn
时,它会生成一个子进程并自动创建 stdin、stdout 和 stderr 流以与子进程交互。
const child = require('child_process');
const subProcess = child.spawn("python", ["myPythonScript.py"])
subProcess.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
因此我在我的项目中实现了这一点,但问题是只有当缓冲区达到一定大小时,子进程才会实际写入输出流。而不是在缓冲区设置数据时(无论数据大小)。
事实上,我想在将子进程写入输出流时直接接收子进程输出流,而不是在它填满整个缓冲区时接收。任何解决方案?
编辑:正如 t.888 所指出的,它实际上应该像我预期的那样工作。如果我生成另一个子进程,它实际上会发生。这次是 C++。但我不知道为什么在我生成 python 脚本时它不起作用。实际上,python 脚本仅通过 stdout 发送大块消息(可能在缓冲区已满时)
我认为你需要 readline
。
const fs = require('fs');
const readline = require('readline');
async function processLineByLine() {
const fileStream = fs.createReadStream('input.txt');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.
for await (const line of rl) {
// Each line in input.txt will be successively available here as `line`.
console.log(`Line from file: ${line}`);
}
}
processLineByLine();
来自https://nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line
我昨天解决了我的问题。这实际上是由于 python 本身而不是 child_process
函数。
我必须做
const subProcess = child.spawn("python", ["-u", "myPythonScript.py"])
而不是
const subProcess = child.spawn("python", ["myPythonScript.py"])
确实,-u
参数告诉 python 尽快刷新数据。
在 Node 中使用 child_process.spawn
时,它会生成一个子进程并自动创建 stdin、stdout 和 stderr 流以与子进程交互。
const child = require('child_process');
const subProcess = child.spawn("python", ["myPythonScript.py"])
subProcess.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
因此我在我的项目中实现了这一点,但问题是只有当缓冲区达到一定大小时,子进程才会实际写入输出流。而不是在缓冲区设置数据时(无论数据大小)。 事实上,我想在将子进程写入输出流时直接接收子进程输出流,而不是在它填满整个缓冲区时接收。任何解决方案?
编辑:正如 t.888 所指出的,它实际上应该像我预期的那样工作。如果我生成另一个子进程,它实际上会发生。这次是 C++。但我不知道为什么在我生成 python 脚本时它不起作用。实际上,python 脚本仅通过 stdout 发送大块消息(可能在缓冲区已满时)
我认为你需要 readline
。
const fs = require('fs');
const readline = require('readline');
async function processLineByLine() {
const fileStream = fs.createReadStream('input.txt');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
// Note: we use the crlfDelay option to recognize all instances of CR LF
// ('\r\n') in input.txt as a single line break.
for await (const line of rl) {
// Each line in input.txt will be successively available here as `line`.
console.log(`Line from file: ${line}`);
}
}
processLineByLine();
来自https://nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line
我昨天解决了我的问题。这实际上是由于 python 本身而不是 child_process
函数。
我必须做
const subProcess = child.spawn("python", ["-u", "myPythonScript.py"])
而不是
const subProcess = child.spawn("python", ["myPythonScript.py"])
确实,-u
参数告诉 python 尽快刷新数据。