Перенаправить вывод потока в строку в Python
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(), но поскольку они работают параллельно, выходная последовательность явно испорчена. Я изучаю субпроцесс, который нужно использовать, но не знаю, как.. Еще пытаюсь.
Это можно сделать? Если так, пожалуйста, покажи мне путь. Заранее спасибо:)
3 ответа
Используйте модуль регистрации Python. Это обрабатывает сериализацию доступа, и вы можете установить уровень для каждого журнала. Отметка времени сообщения может потребоваться с идентификатором журнала.
Ссылка здесь http://docs.python.org/howto/logging.html
Я попытался использовать StringIO(), но поскольку они работают параллельно, выходная последовательность явно испорчена.
Поскольку этот метод работает, вы можете придерживаться его: Redirect sys.stdout
в отдельный StringIO
объект для каждого потока. Перенаправить один раз перед созданием первого потока; затем перенаправить на другой StringIO
перед созданием второго потока. Ваша функция findStats
может сделать все это, и должен возвращать два строковых буфера в виде кортежа.
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".
Я не знаю, насколько подлинным этот метод выше. Но это на самом деле работает для меня.
Кроме того, этот метод перенаправления вывода на печать в StringIO не будет работать, если вы попытаетесь использовать поток вместо Process, потому что поток наследует источник ввода-вывода родителя, а когда вы изменяете его в определенном потоке, он изменяется для родительского потока тоже. Но для дочернего процесса он не мешает источникам ввода-вывода родителя. Итак, это работает.