我有一个基础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语句与最终返回值一起发送。
答案 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的开始