code: def readable_popen(*args, **kwargs):
      
      # force pipes
      kwargs["stdout"] = subprocess.PIPE
      kwargs["stderr"] = subprocess.STDOUT
  
      p = subprocess.Popen(*args, **kwargs)
  
      for line in iter(lambda: p.stdout.readline(), ""):
          if six.PY3:
              line = line.decode("utf-8")
          yield line.rstrip()
  
      # yield the process itself in the end
      p.communicate()
      yield p
docs: Shorthand to :py:class:`Popen` which yields the output live line-by-line. All *args* and
      *kwargs* are forwatded to the :py:class:`Popen` constructor. When EOF is reached,
      ``communicate()`` is called on the subprocess and it is yielded. Example:
  
      .. code-block:: python
  
          for line in readable_popen(["some_executable", "--args"]):
              if isinstance(line, str):
                  print(line)
              else:
                  process = line
                  if process.returncode != 0:
                      raise Exception("complain ...")