2012-07-12 4 views
0
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()를 사용해 보았지만 병렬 실행 스레드이므로 출력 순서가 엉망입니다. 내가 사용하는 subprocess 일에 대해 배우고 있지만 확실하지 .. 어떻게 아직도 노력하고있어.

할 수 있습니까? 그렇다면, 제게 길을 보여주십시오. 미리 감사드립니다 :)

답변

1

파이썬의 로깅 모듈을 사용하십시오. 이것은 액세스의 직렬화를 처리하며 각 로그에 대해 레벨을 설정할 수 있습니다. 로그 식별자와 함께 메시지를 스탬프하는 시간이 필요할 수 있습니다. 여기

링크 http://docs.python.org/howto/logging.html

+0

이렇게하면 복잡해집니다. 그럼에도 불구하고 그 아이디어는 훌륭했습니다. 내 요구에, 내 대답의 코드는 괜찮 았어. – VoodooChild92

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'및 '루프'에서 인쇄 된 출력을 포함한다.

나는이 위의 방법이 본격적인 방법을 모르겠다. 그러나 이것은 실제로 나를 위해 작동합니다.

또한 스레드가 부모의 I/O 소스를 상속하고 특정 스레드에서이를 변경할 때 프로세스 대신 스레드를 사용하려고하면 StringIO로 인쇄 출력을 리디렉션하는이 방법은 작동하지 않습니다 스레드가 변경되면 상위 스레드에 대해서도 변경됩니다. 하지만 하위 프로세스의 경우 상위 I/O 소스를 방해하지 않습니다. 그래서, 이것은 작동합니다.

0

StringIO()를 사용해 보았지만 병렬 실행 스레드이므로 출력 순서가 엉망입니다.

이 방법을 사용할 수 있으므로 다음과 같이 처리 할 수 ​​있습니다. sys.stdout을 각 스레드의 StringIO 개체로 리디렉션하십시오. 첫 번째 스레드를 만들기 전에 한 번 리디렉션하십시오. 그런 다음 두 번째 스레드를 만들기 전에 다른 StringIO 개체로 리디렉션하십시오. 귀하의 함수 이 모든 작업을 수행 할 수 있으며 두 문자열 버퍼를 튜플로 반환해야합니다.

관련 문제