diff --git a/launch/launch/actions/execute_process.py b/launch/launch/actions/execute_process.py index 34ece88f4..d1e4e97d5 100644 --- a/launch/launch/actions/execute_process.py +++ b/launch/launch/actions/execute_process.py @@ -426,40 +426,56 @@ def __on_process_stdin( def __on_process_stdout( self, event: ProcessIO ) -> Optional[SomeActionsType]: - self.__stdout_buffer.write(event.text.decode(errors='replace')) - self.__stdout_buffer.seek(0) - last_line = None - for line in self.__stdout_buffer: - if line.endswith(os.linesep): - self.__stdout_logger.info( - self.__output_format.format(line=line[:-len(os.linesep)], this=self) - ) - else: - last_line = line - break - self.__stdout_buffer.seek(0) - self.__stdout_buffer.truncate(0) - if last_line is not None: - self.__stdout_buffer.write(last_line) + to_write = event.text.decode(errors='replace') + if self.__stdout_buffer.closed: + # __stdout_buffer was probably closed by __flush_buffers on shutdown. Output without + # buffering. + self.__stdout_logger.info( + self.__output_format.format(line=to_write, this=self) + ) + else: + self.__stdout_buffer.write(to_write) + self.__stdout_buffer.seek(0) + last_line = None + for line in self.__stdout_buffer: + if line.endswith(os.linesep): + self.__stdout_logger.info( + self.__output_format.format(line=line[:-len(os.linesep)], this=self) + ) + else: + last_line = line + break + self.__stdout_buffer.seek(0) + self.__stdout_buffer.truncate(0) + if last_line is not None: + self.__stdout_buffer.write(last_line) def __on_process_stderr( self, event: ProcessIO ) -> Optional[SomeActionsType]: - self.__stderr_buffer.write(event.text.decode(errors='replace')) - self.__stderr_buffer.seek(0) - last_line = None - for line in self.__stderr_buffer: - if line.endswith(os.linesep): - self.__stderr_logger.info( - self.__output_format.format(line=line[:-len(os.linesep)], this=self) - ) - else: - last_line = line - break - self.__stderr_buffer.seek(0) - self.__stderr_buffer.truncate(0) - if last_line is not None: - self.__stderr_buffer.write(last_line) + to_write = event.text.decode(errors='replace') + if self.__stderr_buffer.closed: + # __stderr buffer was probably closed by __flush_buffers on shutdown. Output without + # buffering. + self.__stderr_logger.info( + self.__output_format.format(line=to_write, this=self) + ) + else: + self.__stderr_buffer.write(to_write) + self.__stderr_buffer.seek(0) + last_line = None + for line in self.__stderr_buffer: + if line.endswith(os.linesep): + self.__stderr_logger.info( + self.__output_format.format(line=line[:-len(os.linesep)], this=self) + ) + else: + last_line = line + break + self.__stderr_buffer.seek(0) + self.__stderr_buffer.truncate(0) + if last_line is not None: + self.__stderr_buffer.write(last_line) def __flush_buffers(self, event, context): with self.__stdout_buffer as buf: