环境与外部调用
获取环境变量及平台属性
print("操作系统:${Platform.operatingSystem}");
print("CPU核数:${Platform.numberOfProcessors}");
print("文件URI:${Platform.script}");
print("文件路径:${Platform.script.toFilePath()}\n");
// 检查当前平台
print(Platform.isWindows);
// 遍历所有环境变量
Platform.environment.forEach((k, v) {
print(k + "=" + v);
});
调用外部程序
调用外部程序可使用两个函数,start和run,原型如下
external static Future<Process> start(
String executable, List<String> arguments,
{String workingDirectory,
Map<String, String> environment,
bool includeParentEnvironment: true,
bool runInShell: false,
ProcessStartMode mode: ProcessStartMode.normal});
external static Future<ProcessResult> run(
String executable, List<String> arguments,
{String workingDirectory,
Map<String, String> environment,
bool includeParentEnvironment: true,
bool runInShell: false,
Encoding stdoutEncoding: systemEncoding,
Encoding stderrEncoding: systemEncoding});
简单示例
/**
* ProcessStartMode 有三个枚举值
* ProcessStartMode.NORMAL,默认值
* 新运行的程序作为主程序的子进程,并通过数据流stdin stdout stderr连接通信
* ProcessStartMode.DETACHED
* 创建一个独立的进程,与主进程无数据流连接,主进程只能获得子进程的pid
* 关闭主进程后,对其没有影响
* ProcessStartMode.DETACHED_WITH_STDIO
* 创建一个独立的进程,但是与主进程可以通过标准流stdin stdout stderr交互
*/
Process.start("ping", ['www.baidu.com']).then((Process process) {
// 如果原文有中文等特殊字符,字节列表在转换为String的时候,需要对字节列表进行重新编码
process.stdout
.transform(systemEncoding.decoder)
.listen((data) => stdout.add(utf8.encode(data)));
});
/**
* 创建一个子进程,返回运行结果
* stdout和stderr默认编码为systemEncoding,可在Process.run的命名可选参数中设置
*/
Process.run('ping', ['www.baidu.com']).then((result) {
stdout.write(result.stdout);
stderr.write(result.stderr);
});
可以看到,start和run的 区别在于是否可以和子进程进行交互,通常我们执行一个简单命令使用run方法即可,如何需要获取命令程序的输入输出流,则可以使用start
公众号“编程之路从0到1”