code: def run(self):
      self.process = subprocess.Popen(
          self.command,
          shell=True,
          stdout=subprocess.PIPE,
          stderr=subprocess.PIPE,
      )
  
      while True:
          self._read_stdout()
          self._read_stderr()
          if self.process.poll() is not None:
              break
          time.sleep(0.1)
      self.exit_code = self.process.returncode
      with open(str(self.exit_code_path), "w") as f:
          f.write(str(self.exit_code))
  
      self._read_stdout()
      self._read_stderr()
      self.ui_mode.end()
  
file_path: labml/remote/labml_remote/execute/local.py
imports: import subprocess
  import threading
  import time
  from pathlib import Path
  from typing.io import IO
  from labml import monit
  from labml_remote.execute import UIMode
label_desc: Use image node_id 5 for calling the ExecutorThread obj's underlying member method code with example usage: obj.run() without return types