def execute(self, main_class, cwd=None, *args, **environment):
    """Executes the given main_class with any supplied args in the given environment.

    :param string main_class: the fully qualified class name of the main entrypoint
    :param string cwd: Set the working directory for this command
    :param list args: any arguments to pass to the main entrypoint
    :param dict environment: an env mapping made available to native nails via the nail context
    :returns: the exit code of the main_class.
    :raises: :class:`NailgunClient.NailgunError` if there was an error during execution.
    """
    environment = dict(**environment)
    environment.update(self.ENV_DEFAULTS)
    cwd = cwd or self._workdir

    sock = self.try_connect()

    # TODO(#6579): NailgunClientSession currently requires callbacks because it can't depend on
    # having received these chunks, so we need to avoid clobbering these fields until we initialize
    # a new session.
    self._current_remote_pid = None
    self._current_remote_pgrp = None
    self._session = NailgunClientSession(
      sock=sock,
      in_file=self._stdin,
      out_file=self._stdout,
      err_file=self._stderr,
      exit_on_broken_pipe=self._exit_on_broken_pipe,
      remote_pid_callback=self._receive_remote_pid,
      remote_pgrp_callback=self._receive_remote_pgrp)
    try:
      return self._session.execute(cwd, main_class, *args, **environment)
    except (socket.error, NailgunProtocol.ProtocolError) as e:
      raise self.NailgunError(
        address=self._address_string,
        pid=self._maybe_last_pid(),
        pgrp=self._maybe_last_pgrp(),
        wrapped_exc=e,
      )
    finally:
      sock.close()
      self._session = None
def execute ( self , main_class , cwd = None , * args , ** environment ) : environment = dict ( ** environment ) environment . update ( self . ENV_DEFAULTS ) cwd = cwd or self . _workdir sock = self . try_connect ( ) self . _current_remote_pid = None self . _current_remote_pgrp = None self . _session = NailgunClientSession ( sock = sock , in_file = self . _stdin , out_file = self . _stdout , err_file = self . _stderr , exit_on_broken_pipe = self . _exit_on_broken_pipe , remote_pid_callback = self . _receive_remote_pid , remote_pgrp_callback = self . _receive_remote_pgrp ) try : return self . _session . execute ( cwd , main_class , * args , ** environment ) except ( socket . error , NailgunProtocol . ProtocolError ) as e : raise self . NailgunError ( address = self . _address_string , pid = self . _maybe_last_pid ( ) , pgrp = self . _maybe_last_pgrp ( ) , wrapped_exc = e , ) finally : sock . close ( ) self . _session = None
Executes the given main_class with any supplied args in the given environment.

    :param string main_class: the fully qualified class name of the main entrypoint
    :param string cwd: Set the working directory for this command
    :param list args: any arguments to pass to the main entrypoint
    :param dict environment: an env mapping made available to native nails via the nail context
    :returns: the exit code of the main_class.
    :raises: :class:`NailgunClient.NailgunError` if there was an error during execution.