From d8aea069fadf62bb2ab0f700625aa85003f8b987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Mon, 8 Apr 2024 23:54:55 +0800 Subject: [PATCH] fixbug: terminal --- metagpt/logs.py | 2 +- metagpt/tools/libs/terminal.py | 11 +++++++++-- tests/metagpt/tools/libs/test_terminal.py | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/metagpt/logs.py b/metagpt/logs.py index 480477e6b..4f87b62e8 100644 --- a/metagpt/logs.py +++ b/metagpt/logs.py @@ -26,7 +26,7 @@ class ToolLogItem(BaseModel): TOOL_LOG_END_MARKER = ToolLogItem( - type="str", name="end_marker", value="#END#" + type="str", name="end_marker", value="\x18\x19\x1B\x18" ) # A special log item to suggest the end of a stream log diff --git a/metagpt/tools/libs/terminal.py b/metagpt/tools/libs/terminal.py index a23ebb86a..351aa4f6f 100644 --- a/metagpt/tools/libs/terminal.py +++ b/metagpt/tools/libs/terminal.py @@ -39,7 +39,7 @@ class Terminal: # Send the command self.process.stdin.write(cmd + self.command_terminator) self.process.stdin.write( - f'echo "{TOOL_LOG_END_MARKER.value}"' + self.command_terminator + f'echo "{TOOL_LOG_END_MARKER.value}"' + self.command_terminator # write EOF ) # Unique marker to signal command end self.process.stdin.flush() log_tool_output( @@ -49,7 +49,14 @@ class Terminal: # Read the output until the unique marker is found while True: line = self.process.stdout.readline() - if line.strip() == TOOL_LOG_END_MARKER.value: + ix = line.rfind(TOOL_LOG_END_MARKER.value) + if ix >= 0: + line = line[0:ix] + if line: + log_tool_output( + output=ToolLogItem(name="output", value=line), tool_name="Terminal" + ) # log stdout in real-time + cmd_output.append(line) log_tool_output(TOOL_LOG_END_MARKER) break log_tool_output( diff --git a/tests/metagpt/tools/libs/test_terminal.py b/tests/metagpt/tools/libs/test_terminal.py index 97c33b977..98ed63dd8 100644 --- a/tests/metagpt/tools/libs/test_terminal.py +++ b/tests/metagpt/tools/libs/test_terminal.py @@ -1,3 +1,5 @@ +import pytest + from metagpt.const import DATA_PATH, METAGPT_ROOT from metagpt.tools.libs.terminal import Terminal @@ -13,3 +15,7 @@ def test_terminal(): terminal.run_command("cd data") output = terminal.run_command("pwd") assert output.strip() == str(DATA_PATH) + + +if __name__ == "__main__": + pytest.main([__file__, "-s"])