code: def run_cmd(self, cmd, cwd=None, extra_env=None):
          
          all_output = []
          cmd_parts = []
  
          for part in cmd:
              if len(part) > 45:
                  part = part[:20] + "..." + part[-20:]
              if ' ' in part or '\n' in part or '"' in part or "'" in part:
                  part = '"%s"' % part.replace('"', '\\"')
              cmd_parts.append(part)
          cmd_desc = ' '.join(cmd_parts)
          logger.debug(" ** Running command %s" % cmd_desc)
  
          # output
          stdout = subprocess.PIPE
  
          # env
          if extra_env:
              env = os.environ.copy()
              if extra_env:
                  env.update(extra_env)
          else:
              env = None
  
          # execute
          try:
              proc = subprocess.Popen(
                  [' '.join(cmd)], stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
                  cwd=cwd, env=env, shell=True)
          except Exception:
              e = sys.exc_info()[1]
              logger.error("Error %s while executing command %s" % (e, cmd_desc))
              raise
  
          stdout = proc.stdout
          while stdout:
              line = stdout.readline()
              if not line:
                  break
              line = line.rstrip()
              all_output.append(line)
              logger.info(line)
          proc.wait()
  
          # error handler
          if proc.returncode:
              for s in all_output:
                  logger.critical(s)
              raise OSError("Command %s failed with error code %s"
                  % (cmd_desc, proc.returncode))
  
          return proc.returncode, all_output
docs: h/t https://github.com/elbaschid/virtual-node/blob/master/setup.py