docs: async def exec_subprocess(argv):
      """
      An Future task that represents a subprocess. If successful, the task's
      result is set to the collected STDOUT of the subprocess.
  
      :raises subprocess.CalledProcessError: if the subprocess returns a non-zero
                                             exit code
      """
      future = Future()
      process = Gio.Subprocess.new(
          argv,
          Gio.SubprocessFlags.STDOUT_PIPE |
          Gio.SubprocessFlags.STDIN_INHERIT)
      stdin_buf = None
      cancellable = None
      process.communicate_utf8_async(
          stdin_buf, cancellable, gio_callback, future)
      result = await future
      success, stdout, stderr = process.communicate_utf8_finish(result)
      if not success:
          raise RuntimeError("Subprocess did not exit normally!")
      exit_code = process.get_exit_status()
      if exit_code != 0:
          raise CalledProcessError(
              "Subprocess returned a non-zero exit-status!",
              exit_code,
              stdout)
      return stdout