首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何运行Python子进程和流,同时过滤stdout和stderr?

如何运行Python子进程和流,同时过滤stdout和stderr?
EN

Stack Overflow用户
提问于 2016-03-29 15:27:29
回答 2查看 4.1K关注 0票数 2

我有一个类似服务器的应用程序,我想从Python中运行。它永远不会停止,直到用户中断它。当应用程序运行时,我希望不断地将stdout和stderr重定向到parent。幸运的是,这正是subprocess.run所做的。

Shell:

wrapper.py

执行wrapper.py

我相信这要归功于subprocess.run从父进程继承了stdout和stderr文件描述。很好。

但是现在,当应用程序输出特定行时,我需要做一些事情。想象一下,当输出行包含4时,我想运行任意Python代码

或者我想从输出中删除一些行:

我想我可以有一个过滤函数,我只需以某种方式将其挂钩到subprocess.run中,它将被输出的每一行调用,无论它是标准输出还是标准错误:

但是如何做到这一点呢?如何将这样或类似的函数挂接到subprocess.run调用中?

注意:我不能使用sh库,因为它对Windows零支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-29 15:48:31

如果您希望能够处理子进程的stdout或stderr,只需为参数stdout (resp.stderr)。然后,您可以通过proc.stdout从子流程访问输出流,默认情况下是以字节流的形式访问,但是您可以使用universal_newlines = True以字符串的形式获取它。示例:

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 2021-02-27 23:04:17

我相信这段代码可以做到这一点。前面的答案没有解决同时读取两个流的问题,这需要异步。否则,另一个答案可以过滤stdout,,然后在stdout之后执行stderr。

这是python 3.8,它为asyncio提供了更具描述性的方法名称。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36277995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档