为何Dart代码无法获取pwd命令执行结果?如何修改?
解决Dart中
Process.start获取pwd结果为空的问题 你的猜测是对的——pwd是个极轻量的命令,启动后瞬间执行完毕并输出结果,可能在你注册stdout监听器之前,它的输出流就已经关闭了,所以监听器根本没机会捕获到数据。
这里有两种可靠的解决方式:
方法一:用Process.run替代(推荐)
Process.run是专门为这种一次性执行命令并获取结果的场景设计的,它会自动帮你处理输出捕获、等待进程结束,代码更简洁可靠:
import 'dart:io'; void main() async { var result = await Process.run('pwd', []); print('stdout: ${result.stdout}'); print('stderr: ${result.stderr}'); print('exit code: ${result.exitCode}'); }
方法二:改进Process.start的写法
如果一定要用Process.start,可以先将stdout的流转换为列表来收集所有输出,这样不管进程执行快慢,都能完整获取数据:
import 'dart:io'; import 'dart:convert'; void main() async { var process = await Process.start('pwd', []); // 先收集所有stdout数据,再处理 var stdoutData = await process.stdout.transform(utf8.decoder).join(); var stderrData = await process.stderr.transform(utf8.decoder).join(); print('stdout: $stdoutData'); print('stderr: $stderrData'); int exitCode = await process.exitCode; print('exit code: $exitCode'); }
这么做的原因是,stdout.transform(utf8.decoder).join()会等待整个输出流结束,把所有字节拼接成字符串,既避免了监听器注册不及时的问题,也解决了原始代码直接打印字节数组无法读取的问题。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

