def run(self): cmd, args = self.args[0], self.args[1:] full_cmd = ' '.join(self.args) logger.info(full_cmd) cmd_path = which(cmd, self.path) try: return_code, output = popen([cmd_path] + list(args), silent=self.silent, env=self.env) if return_code not in self.success_codes: logger.error('Command {} failed with exit code {}{}'.format( full_cmd, return_code, ':' if self.silent else '')) if self.silent: sys.stderr.write(output) raise CommandFailed('Returned code {}'.format(return_code)) return output if self.silent else True except KeyboardInterrupt: logger.error('Interrupted...') raise
def run(args, *, env=None, silent=False, path=None, success_codes=None, log=True, external=False, **popen_kws): """Run a command-line program.""" if success_codes is None: success_codes = [0] cmd, args = args[0], args[1:] full_cmd = "{} {}".format(cmd, " ".join(args)) cmd_path = which(cmd, path) if log: logger.info(full_cmd) is_external_tool = path is not None and not cmd_path.startswith(path) if is_external_tool: if external == "error": logger.error( "Error: {} is not installed into the virtualenv, it is located at {}. " "Pass external=True into run() to explicitly allow this.". format(cmd, cmd_path)) raise CommandFailed("External program disallowed.") elif external is False: logger.warning( "Warning: {} is not installed into the virtualenv, it is located at {}. This might cause issues! " "Pass external=True into run() to silence this message.". format(cmd, cmd_path)) env = _clean_env(env) try: return_code, output = popen([cmd_path] + list(args), silent=silent, env=env, **popen_kws) if return_code not in success_codes: logger.error("Command {} failed with exit code {}{}".format( full_cmd, return_code, ":" if silent else "")) if silent: sys.stderr.write(output) raise CommandFailed("Returned code {}".format(return_code)) return output if silent else True except KeyboardInterrupt: logger.error("Interrupted...") raise
def run(self, path_override=None, env_fallback=None, **kwargs): path = self.path if path_override is None else path_override env = env_fallback.copy() if env_fallback is not None else None if self.env is not None: if env is None: env = self.env else: env.update(self.env) cmd, args = self.args[0], self.args[1:] full_cmd = ' '.join(self.args) logger.info(full_cmd) cmd_path = which(cmd, path) # Environment variables must be the "str" type. # In other words, they must be bytestrings in Python 2, and Unicode # text strings in Python 3. clean_env = {} if env is not None else None if clean_env is not None: # Ensure systemroot is passed down, otherwise Windows will explode. clean_env[str('SYSTEMROOT')] = os.environ.get( 'SYSTEMROOT', str('')) for key, value in six.iteritems(env): key = coerce_str(key) value = coerce_str(value) clean_env[key] = value try: return_code, output = popen( [cmd_path] + list(args), silent=self.silent, env=clean_env) if return_code not in self.success_codes: logger.error('Command {} failed with exit code {}{}'.format( full_cmd, return_code, ':' if self.silent else '')) if self.silent: sys.stderr.write(output) raise CommandFailed('Returned code {}'.format(return_code)) return output if self.silent else True except KeyboardInterrupt: logger.error('Interrupted...') raise
def run(self, path_override=None, env_override=None): path = self.path if path_override is None else path_override env = self.env if env_override is None else env_override cmd, args = self.args[0], self.args[1:] full_cmd = ' '.join(self.args) logger.info(full_cmd) cmd_path = which(cmd, path) # Environment variables must be bytestrings. clean_env = {} if env is not None else None if clean_env is not None: # Ensure systemroot is passed down, otherwise Windows will explode. clean_env[str('SYSTEMROOT')] = os.environ.get( 'SYSTEMROOT', str('')) for key, value in six.iteritems(env): if not isinstance(key, six.text_type): key = key.decode('utf-8') if not isinstance(value, six.text_type): value = value.decode('utf-8') clean_env[key] = value try: return_code, output = popen([cmd_path] + list(args), silent=self.silent, env=clean_env) if return_code not in self.success_codes: logger.error('Command {} failed with exit code {}{}'.format( full_cmd, return_code, ':' if self.silent else '')) if self.silent: sys.stderr.write(output) raise CommandFailed('Returned code {}'.format(return_code)) return output if self.silent else True except KeyboardInterrupt: logger.error('Interrupted...') raise
def run( args: Sequence[str], *, env: Optional[dict] = None, silent: bool = False, paths: Optional[List[str]] = None, success_codes: Optional[Iterable[int]] = None, log: bool = True, external: Union[Literal["error"], bool] = False, **popen_kws: Any, ) -> Union[str, bool]: """Run a command-line program.""" if success_codes is None: success_codes = [0] cmd, args = args[0], args[1:] full_cmd = f"{cmd} {_shlex_join(args)}" cmd_path = which(cmd, paths) if log: logger.info(full_cmd) is_external_tool = paths is not None and not any( cmd_path.startswith(path) for path in paths) if is_external_tool: if external == "error": logger.error( f"Error: {cmd} is not installed into the virtualenv, it is located at {cmd_path}. " "Pass external=True into run() to explicitly allow this.") raise CommandFailed("External program disallowed.") elif external is False: logger.warning( f"Warning: {cmd} is not installed into the virtualenv, it is located at {cmd_path}. This might cause issues! " "Pass external=True into run() to silence this message.") env = _clean_env(env) try: return_code, output = popen([cmd_path] + list(args), silent=silent, env=env, **popen_kws) if return_code not in success_codes: suffix = ":" if silent else "" logger.error( f"Command {full_cmd} failed with exit code {return_code}{suffix}" ) if silent: sys.stderr.write(output) raise CommandFailed(f"Returned code {return_code}") if output: logger.output(output) return output if silent else True except KeyboardInterrupt: logger.error("Interrupted...") raise
def run( args, *, env=None, silent=False, path=None, success_codes=None, log=True, external=False ): """Run a command-line program.""" if success_codes is None: success_codes = [0] cmd, args = args[0], args[1:] full_cmd = "{} {}".format(cmd, " ".join(args)) cmd_path = which(cmd, path) if log: logger.info(full_cmd) is_external_tool = path is not None and not cmd_path.startswith(path) if is_external_tool: if external == "error": logger.error( "Error: {} is not installed into the virtualenv, it is located at {}. " "Pass external=True into run() to explicitly allow this.".format( cmd, cmd_path ) ) raise CommandFailed("External program disallowed.") elif external is False: logger.warning( "Warning: {} is not installed into the virtualenv, is it located at {}. This might cause issues! " "Pass external=True into run() to silence this message.".format( cmd, cmd_path ) ) env = _clean_env(env) try: return_code, output = popen([cmd_path] + list(args), silent=silent, env=env) if return_code not in success_codes: logger.error( "Command {} failed with exit code {}{}".format( full_cmd, return_code, ":" if silent else "" ) ) if silent: sys.stderr.write(output) raise CommandFailed("Returned code {}".format(return_code)) return output if silent else True except KeyboardInterrupt: logger.error("Interrupted...") raise