code: def wait(self):
          
          if not self._process_completed:
              self._process_completed = True
  
              exit_code = self.process.wait()
              if self.process.timed_out:
                  # if we timed out, our exit code represents a signal, which is
                  # negative, so let's make it positive to store in our
                  # TimeoutException
                  raise TimeoutException(-exit_code)
  
              else:
                  self.handle_command_exit_code(exit_code)
          
                  # if an iterable command is using an instance of OProc for its stdin,
                  # wait on it.  the process is probably set to "piped", which means it
                  # won't be waited on, which means exceptions won't propagate up to the
                  # main thread.  this allows them to bubble up
                  if self.process._stdin_process:
                      self.process._stdin_process.command.wait()
  
          self.log.info("process completed")
          return self
docs: waits for the running command to finish.  this is called on all
          running commands, eventually, except for ones that run in the background