mirror of
https://github.com/langgenius/dify.git
synced 2026-03-07 08:35:58 +08:00
feat: introduce TransportEOFError for handling closed transport scenarios and update transport classes to raise it
This commit is contained in:
@ -50,8 +50,16 @@ pid, transport_stdout, transport_stderr, transport_stdin = environment.execute_c
|
||||
print(f"Executed command with PID: {pid}")
|
||||
|
||||
# consume stdout
|
||||
output = transport_stdout.read(1024)
|
||||
print(f"Command output: {output.decode().strip()}")
|
||||
# consume stdout
|
||||
while True:
|
||||
try:
|
||||
output = transport_stdout.read(1024)
|
||||
except TransportEOFError:
|
||||
logger.info("End of stdout reached")
|
||||
break
|
||||
|
||||
logger.info("Command output: %s", output.decode().strip())
|
||||
|
||||
|
||||
environment.release_connection(connection_handle)
|
||||
environment.release_environment()
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import os
|
||||
import shlex
|
||||
import threading
|
||||
from collections.abc import Mapping, Sequence
|
||||
from enum import StrEnum
|
||||
@ -50,8 +51,16 @@ pid, transport_stdin, transport_stdout, transport_stderr = environment.execute_c
|
||||
logger.info("Executed command with PID: %s", pid)
|
||||
|
||||
# consume stdout
|
||||
output = transport_stdout.read(1024)
|
||||
logger.info("Command output: %s", output.decode().strip())
|
||||
# consume stdout
|
||||
while True:
|
||||
try:
|
||||
output = transport_stdout.read(1024)
|
||||
except TransportEOFError:
|
||||
logger.info("End of stdout reached")
|
||||
break
|
||||
|
||||
logger.info("Command output: %s", output.decode().strip())
|
||||
|
||||
|
||||
environment.release_connection(connection_handle)
|
||||
environment.release_environment()
|
||||
@ -204,17 +213,19 @@ class E2BEnvironment(VirtualEnvironment):
|
||||
""" """
|
||||
stdout_stream_write_handler = stdout_stream.get_write_handler()
|
||||
stderr_stream_write_handler = stderr_stream.get_write_handler()
|
||||
sandbox.commands.run(
|
||||
cmd=" ".join(command),
|
||||
envs=dict(environments or {}),
|
||||
# stdin=True,
|
||||
on_stdout=lambda data: stdout_stream_write_handler.write(data.encode()),
|
||||
on_stderr=lambda data: stderr_stream_write_handler.write(data.encode()),
|
||||
)
|
||||
|
||||
# Close the write handlers to signal EOF
|
||||
stdout_stream.close()
|
||||
stderr_stream.close()
|
||||
try:
|
||||
sandbox.commands.run(
|
||||
cmd=shlex.join(command),
|
||||
envs=dict(environments or {}),
|
||||
# stdin=True,
|
||||
on_stdout=lambda data: stdout_stream_write_handler.write(data.encode()),
|
||||
on_stderr=lambda data: stderr_stream_write_handler.write(data.encode()),
|
||||
)
|
||||
finally:
|
||||
# Close the write handlers to signal EOF
|
||||
stdout_stream.close()
|
||||
stderr_stream.close()
|
||||
|
||||
@cached_property
|
||||
def api_key(self) -> str:
|
||||
|
||||
@ -14,6 +14,48 @@ from core.virtual_environment.__base.virtual_environment import VirtualEnvironme
|
||||
from core.virtual_environment.channel.pipe_transport import PipeReadCloser, PipeWriteCloser
|
||||
from core.virtual_environment.channel.transport import TransportReadCloser, TransportWriteCloser
|
||||
|
||||
"""
|
||||
USAGE:
|
||||
|
||||
import logging
|
||||
from collections.abc import Mapping
|
||||
from typing import Any
|
||||
|
||||
from core.virtual_environment.channel.exec import TransportEOFError
|
||||
from core.virtual_environment.providers.local_without_isolation import LocalVirtualEnvironment
|
||||
|
||||
options: Mapping[str, Any] = {}
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
environment = LocalVirtualEnvironment(options=options)
|
||||
|
||||
connection_handle = environment.establish_connection()
|
||||
|
||||
pid, transport_stdin, transport_stdout, transport_stderr = environment.execute_command(
|
||||
connection_handle,
|
||||
["sh", "-lc", "for i in 1 2 3 4 5; do date '+%F %T'; sleep 1; done"],
|
||||
)
|
||||
|
||||
logger.info("Executed command with PID: %s", pid)
|
||||
|
||||
# consume stdout
|
||||
while True:
|
||||
try:
|
||||
output = transport_stdout.read(1024)
|
||||
except TransportEOFError:
|
||||
logger.info("End of stdout reached")
|
||||
break
|
||||
|
||||
logger.info("Command output: %s", output.decode().strip())
|
||||
|
||||
|
||||
environment.release_connection(connection_handle)
|
||||
environment.release_environment()
|
||||
|
||||
"""
|
||||
|
||||
|
||||
class LocalVirtualEnvironment(VirtualEnvironment):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user