def _run(cls, command, *args, **kwargs): """ Run a command. Convenience wrapper for subprocess.check_call and subprocess.check_output. :param str command: The command to be run. :param str args: Any arguments to be passed to the command. :param Any kwargs: keyword arguments for subprocess.Popen constructor. Pass capture=True to have the process' stdout returned. Pass input='some string' to feed input to the process' stdin. :rtype: None|str :return: The output of the process' stdout if capture=True was passed, None otherwise. """ args = list(concat(command, args)) log.info('Running %r', args) capture = kwargs.pop('capture', False) _input = kwargs.pop('input', None) if capture: kwargs['stdout'] = subprocess.PIPE if _input is not None: kwargs['stdin'] = subprocess.PIPE popen = subprocess.Popen(args, **kwargs) stdout, stderr = popen.communicate(input=_input) assert stderr is None if popen.returncode != 0: raise subprocess.CalledProcessError(popen.returncode, args) if capture: return stdout
def run(self): command = self.parasolCommand() with self.lock: self.popen = subprocess.Popen(command) status = self.popen.wait() if status != 0 and status != -signal.SIGKILL: log.error("Command '%s' failed with %i.", command, status) raise subprocess.CalledProcessError(status, command) log.info('Exiting %s', self.__class__.__name__)