code: def execute(self, cmd, cwd):
          
          self.output = ""
          env = os.environ.copy()
          env.update(self.env)
          if six.PY2:  # nocv
              # Ugly hack because python 2.7.
              if self._stdout == self.DEVNULL:
                  self._stdout = open(os.devnull, 'w+b')
              if self._stderr == self.DEVNULL:
                  self._stderr = open(os.devnull, 'w+b')
          proc = subprocess.Popen(
              cmd, stdout=self._stdout, stderr=self._stderr,
              bufsize=0, universal_newlines=True,
              cwd=cwd, env=env,
              close_fds=ON_POSIX
          )
          for line in self._unbuffered(proc):
              self.line_handler(line)
          return_code = proc.poll()
          if return_code:
              logger.error(self.output)
              raise subprocess.CalledProcessError(
                  return_code, cmd, output=str(self.output)
              )
          return self.output
docs: Execute commands and output this
  
          :param cmd: -- list of cmd command and arguments
          :type cmd: list
          :param cwd: -- workdir for executions
          :type cwd: str,unicode
          :return: -- string with full output
          :rtype: str