我有一个类似服务器的应用程序,我想从Python中运行。它永远不会停止,直到用户中断它。当应用程序运行时,我希望不断地将stdout和stderr重定向到parent。幸运的是,这正是subprocess.run
所做的。
Shell:
wrapper.py
执行wrapper.py
我相信这要归功于subprocess.run
从父进程继承了stdout和stderr文件描述。很好。
但是现在,当应用程序输出特定行时,我需要做一些事情。想象一下,当输出行包含4
时,我想运行任意Python代码
或者我想从输出中删除一些行:
我想我可以有一个过滤函数,我只需以某种方式将其挂钩到subprocess.run
中,它将被输出的每一行调用,无论它是标准输出还是标准错误:
但是如何做到这一点呢?如何将这样或类似的函数挂接到subprocess.run
调用中?
注意:我不能使用sh
库,因为它对Windows零支持。
发布于 2016-03-29 15:48:31
如果您希望能够处理子进程的stdout或stderr,只需为参数stdout
(resp.stderr
)。然后,您可以通过proc.stdout
从子流程访问输出流,默认情况下是以字节流的形式访问,但是您可以使用universal_newlines = True
以字符串的形式获取它。示例:
import subprocess
app = subprocess.Popen(['my-app'], stdout = subprocess.PIPE, universal_newlines = True)
for line in app.stdout:
if line.strip() == '4':
# special processing
else:
sys.stdout.write(line)
您必须注意的是,为了能够在子进程写入输出后立即处理输出,子进程必须在每行之后刷新输出。缺省情况下,stdout在定向到终端时是行缓冲的-每行都打印在换行符上-但是当定向到文件或管道时,它的大小是缓冲的,这意味着它每8k或16k个字符才会刷新一次。
在这种情况下,无论您对调用者大小做什么,都只能在程序结束时获得stdout。
发布于 2021-02-27 23:04:17
我相信这段代码可以做到这一点。前面的答案没有解决同时读取两个流的问题,这需要异步。否则,另一个答案可以过滤stdout,,然后在stdout之后执行stderr。
这是python 3.8,它为asyncio提供了更具描述性的方法名称。
https://stackoverflow.com/questions/36277995
复制相似问题