Перенаправить вывод потока в строку в 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, потому что поток наследует источник ввода-вывода родителя, а когда вы изменяете его в определенном потоке, он изменяется для родительского потока тоже. Но для дочернего процесса он не мешает источникам ввода-вывода родителя. Итак, это работает.

Другие вопросы по тегам