Python子进程控制输出

时间:2017-12-14 04:46:29

标签: python subprocess buffer stdout

我有一个基础python项目,它可以接受其他python文件并将它们作为子进程执行。基础项目接受用户输入,将其提供给子流程,子流程然后执行代码并通过stdout返回一个值,该值将反馈给用户。

在基础程序中,我正在做类似的事情:

dataReturnValue = subprocess.check_output(['python', pythonScriptPath, json.dumps(inputParams)])

然后在子流程中我有这样的东西:

inputParams = sys.argv[1]
...
...
sys.stdout.write(returnValue)

正确返回数据,但我想要做的是将返回的数据限制为returnValue。现在它返回整个子进程中的所有print语句加上返回值。这对我来说很有意义,因为它是一种输出形式,打印类似于stdout包装器,但我想更好地控制它。

有没有办法在我的最终输出语句之前清除stdout缓冲区,以便从子进程返回的值中不包含杂散打印或输出?

编辑:我已经尝试在最后一次调用之前执行sys.stdout.buffer.flush(),sys.stdout.flush(),希望它能清除缓冲区但是仍然会出现print语句与最终返回值一起发送。

3 个答案:

答案 0 :(得分:1)

试试这个:

import sys
import os

# Your code here

with open(os.devnull, 'w') as sys.stdout:
    # Code that you don't want to be printed here
sys.stdout = sys.__stdout__

# Your code here

编辑:

我甚至把它变成了装扮者

import sys
import os

def silence(func, *args, **kwargs):
    def wrapper(*args, **kwargs):
        with open(os.devnull, 'w') as sys.stdout:
            result = func(*args, **kwargs)
        sys.__dict__['stdout'] = sys.__stdout__
        return result
     return wrapper

在任何类似的函数上使用它:

def test1():
    print("TEST1")

@silence
def test2():
    print("TEST2")

def test3():
    print("TEST3")

test1()
test2()
test3()

输出:

TEST1
TEST3

答案 1 :(得分:0)

这可能不是您正在寻找的答案,但也许这是一种可能的解决方法:

dataReturnValue = dataReturnValue.split("\n")[-1]

答案 2 :(得分:0)

可能这可以帮到你。

你可以使用子进程Popen,PIPE来完成你的任务。如果你想在这里使用多个子流程实例就是链接

Python subprocess: how to use pipes thrice?

如何控制输出?

下面的命令(虚拟命令)将生成100行,但我只需要一行文本'Appium Started'

from subprocess import Popen,PIPE
command='appium-p 4723'
p1=Popen(command,stdout=Pipe)

return_value= 'Started Appium'

#this will store the output which command generated 
output = p3.communicate()[0]

for line in output:
    if returnvalue in line:
        print line
    else:
        pass

最后你只得到你想要的那条线,即Appium的开始

相关问题