def METHOD_NAME(self, *args, **kwargs):
    # FIXME run self._script on a set of host machines, the host is decided
    # by the arguments of the launcher in `__init__`, and those inputs object
    cmd = [self._script]
    for arg in args:
        if isinstance(arg, str):
            cmd.append(arg.encode('unicode-escape').decode('utf-8'))
        else:
            cmd.append(repr(arg))
    env = os.environ.copy()
    for key, value in kwargs.items():
        # if key is all in lower cases, treat it as arguments, otherwise as the
        # environment variables.
        if key.islower():
            cmd.append('--%s' % key)
            if isinstance(value, str):
                cmd.append(value)
            else:
                cmd.append(repr(value))
        else:
            env[key] = value
    logger.debug('command is: %s', ' '.join(cmd))
    self._cmd = cmd
    self._proc = subprocess.Popen(  # pylint: disable=consider-using-with
        cmd,
        env=env,
        universal_newlines=True,
        encoding='utf-8',
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )
    self._status = LauncherStatus.RUNNING
    self._listen_out_thrd = threading.Thread(
        target=self.read_output, args=(self._proc.stdout,)
    )
    self._listen_out_thrd.start()
    self._err_message = []
    self._listen_err_thrd = threading.Thread(
        target=self.read_err, args=(self._proc.stderr,)
    )
    self._listen_err_thrd.start()