code: def run(program, *args, **kwargs):
      
      args = flattened(args, split=SHELL)
      full_path = which(program)
  
      logger = kwargs.pop("logger", LOG.debug)
      fatal = kwargs.pop("fatal", True)
      dryrun = kwargs.pop("dryrun", is_dryrun())
      include_error = kwargs.pop("include_error", False)
  
      message = "Would run" if dryrun else "Running"
      message = "%s: %s %s" % (message, short(full_path or program), represented_args(args))
      if logger:
          logger(message)
  
      if dryrun:
          return message
  
      if not full_path:
          return abort("%s is not installed", short(program), fatal=fatal)
  
      stdout = kwargs.pop("stdout", subprocess.PIPE)
      stderr = kwargs.pop("stderr", subprocess.PIPE)
      args = [full_path] + args
      try:
          path_env = kwargs.pop("path_env", None)
          if path_env:
              kwargs["env"] = added_env_paths(path_env, env=kwargs.get("env"))
          p = subprocess.Popen(args, stdout=stdout, stderr=stderr, **kwargs)  # nosec
          output, err = p.communicate()
          output = decode(output, strip=True)
          err = decode(err, strip=True)
  
          if p.returncode and fatal is not None:
              note = ": %s\n%s" % (err, output) if output or err else ""
              message = "%s exited with code %s%s" % (short(program), p.returncode, note.strip())
              return abort(message, fatal=fatal)
  
          if include_error and err:
              output = "%s\n%s" % (output, err)
          return output and output.strip()
  
      except Exception as e:
          return abort("%s failed: %s", short(program), e, exc_info=e, fatal=fatal)
docs: Run 'program' with 'args