def findStats():
thread1 = thread.start_new_thread(func1, (arg_1, arg_2))
thread2 = thread.start_new_thread(func2, (arg_3, arg_4))
def func1(arg_1, arg_2):
"""
Some code which prints some stuff
"""
def func2(arg_3, arg_4):
"""
Some code which prints some other stuff
"""
在这里,我想要做的是从两个单独的字符串中捕获func1和func2的打印输出,以便我可以使用它在我的GUI中的两个不同选项卡中显示它们。
另外,我尝试使用StringIO(),但由于它们是并行运行的线程,输出序列显然搞砸了。我正在学习使用子进程的东西,但不知道如何..仍在尝试它。
可以吗?如果是这样,请告诉我一个方法。在此先感谢:)
答案 0 :(得分:1)
使用python的日志记录模块。 这会处理访问的序列化,您可以为每个日志设置级别。 使用日志标识符可能需要为消息添加时间戳。
答案 1 :(得分:0)
import sys
from cStringIO import StringIO
from multiprocessing import Process, Queue
def mp():
queue = Queue()
p = Process(target=loop,args=('lo','op'))
q = Process(target=doop,args=('do','op'))
p.start()
q.start()
p.join()
q.join()
def loop(p,x):
old_stdout = sys.stdout # Redirection of the printing output to a StringIO
sys.stdout = mystdout = StringIO()
for i in xrange(100):
print p + x
### Write the code\functions necessary in here. ###
sys.stdout = old_stdout
dataStats_1 = mystdout.getvalue() # Put all the redirected output into a string.
def doop(q,y):
old_stdout = sys.stdout # Redirection of the printing output to a StringIO()
sys.stdout = mystdout = StringIO()
for i in xrange(100):
print q+y
### Write the code\functions necessary in here. ###
sys.stdout = old_stdout
dataStats_2 = mystdout.getvalue()
if __name__ == "__main__":
mp()
因此,在每个dataStats_1和dataStats_2变量中都包含函数'doop'和'loop'的打印输出。
我不知道这个方法有多正宗。但这实际上适合我。
此外,如果您尝试使用线程而不是Process,这种将打印输出重定向到StringIO的方法将无效,因为线程会继承父级的I / O源,并且在特定线程中更改它时,它也会改变父线程。但对于子进程,它不会干扰父进程的I / O源。所以,这很有效。
答案 2 :(得分:0)
我尝试使用StringIO(),但因为它们是并行运行的线程,输出序列显然搞砸了。
由于您使用此方法,因此您可以坚持使用它:将sys.stdout
重定向到每个线程的单独StringIO
对象。在创建第一个线程之前重定向一次;然后在创建第二个线程之前重定向到另一个StringIO
对象。你的函数findStats
可以完成所有这些,并且应该将两个字符串缓冲区作为元组返回。