docs: def run(cmd, outdir=None, logfile=None, inlist=None, void=True, errorpass=False, env=None):
      """
      | wrapper for subprocess execution including logfile writing and command prompt piping
      | this is a convenience wrapper around the :mod:`subprocess` module and calls
        its class :class:`~subprocess.Popen` internally.
      
      Parameters
      ----------
      cmd: list
          the command arguments
      outdir: str
          the directory to execute the command in
      logfile: str
          a file to write stdout to
      inlist: list
          a list of arguments passed to stdin, i.e. arguments passed to interactive input of the program
      void: bool
          return stdout and stderr?
      errorpass: bool
          if False, a :class:`subprocess.CalledProcessError` is raised if the command fails
      env: dict or None
          the environment to be passed to the subprocess
  
      Returns
      -------
      None or Tuple
          a tuple of (stdout, stderr) if `void` is False otherwise None
      """
      cmd = [str(x) for x in dissolve(cmd)]
      if outdir is None:
          outdir = os.getcwd()
      log = sp.PIPE if logfile is None else open(logfile, 'a')
      proc = sp.Popen(cmd, stdin=sp.PIPE, stdout=log, stderr=sp.PIPE, cwd=outdir, env=env)
      instream = None if inlist is None \
          else ''.join([str(x) + '\n' for x in inlist]).encode('utf-8')
      out, err = proc.communicate(instream)
      out = decode_filter(out)
      err = decode_filter(err)
      if not errorpass and proc.returncode != 0:
          raise sp.CalledProcessError(proc.returncode, cmd, err)
      # add line for separating log entries of repeated function calls
      if logfile:
          log.write('#####################################################################\n')
          log.close()
      if not void:
          return out, err