环境与外部调用

获取环境变量及平台属性

  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);
  });

调用外部程序

调用外部程序可使用两个函数,startrun,原型如下

  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);
  });

可以看到,startrun的 区别在于是否可以和子进程进行交互,通常我们执行一个简单命令使用run方法即可,如何需要获取命令程序的输入输出流,则可以使用start


公众号“编程之路从0到1”

20190301102949549

Copyright © Arcticfox 2020 all right reserved,powered by Gitbook文档修订于: 2024-06-09 20:22:55

results matching ""

    No results matching ""