实时读取stdout和stderr时与子进程交互

2024-09-21 03:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在shell命令周围编写一个包装器,将其stdout和stderr分别实时打印回stdout和stderr,同时如果进程提示输入,还允许用户进行交互并向其发送stdin

注意pexpect.interact()几乎解决了这个问题,只是它将所有stdout和stderr组合起来并将其发送回stdout。似乎没有办法阻止它这么做

到目前为止,我拥有的是一种通过subprocess.Popen从进程读取stdout和stderr的方法:

def _popen_command(
    command: List[str]
) -> None:
    """
    Run a shell command with Popen line by line
    in real time without redirecting stdout or stderr.
    """

    with subprocess.Popen(
        command,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    ) as proc:

        selector = selectors.DefaultSelector()
        selector.register(proc.stdout, selectors.EVENT_READ)  
        selector.register(proc.stderr, selectors.EVENT_READ)  

        eof = False
        while not eof:
            for key, _ in selector.select():
                data = key.fileobj.read1(1).decode()  

                if not data:
                    eof = True

                if key.fileobj is proc.stdout:
                    print(data, end="")
                else:
                    print(data, end="", file=sys.stderr)

我认为堆栈溢出中不存在所有这些特性的答案:实时、逐行处理stdout、stderr,并将它们分别打印回stdout、stderr,还允许与stdin进行任意交互

有可能这样做吗


Tags: keydata进程withstderrstdinstdoutproc

热门问题