我需要在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进行任意交互
有可能这样做吗
目前没有回答
相关问题 更多 >
编程相关推荐