2013-07-30 5 views
1

자식 프로세스에서 보낸 메시지를 수신하는 Python 코드가 있습니다. 메시지는 콘솔 창에 직접 인쇄되는 일반 문자열이거나 프로그램의 다른 곳에서 처리되는 예외 객체 및 추적 출력이있는 튜플 일 수 있습니다. multiprocessing.Queue 구현은 프로세스 간 통신에 사용됩니다. 큐 객체는 self.channel에 의해 참조됩니다. msg를 터플 (자식 프로세스를 함유 에러 정보) 인python multiprocessing.Queue.get() 원하지 않는 순간에 아무 것도 출력하지 않습니다.

while self.exp_process.is_alive() or not self.channel.empty(): 
    # Make sure Qt interface stays responsive, gets redrawn, etc. 
    QtGui.QApplication.processEvents() 

    # Check if messages are pending to be processed 
    # Sleep otherwise 
    if not self.channel.empty(): 

     # Encapsulated by print statements for debugging of None print 
     print "Retrieving message" 
     msg = self.channel.get(False) 
     print "Message received" 

     # Directly print received strings         
     if type(msg) in [str, unicode]: 
      sys.stdout.write(msg) 

     # Errors arrive as a tuple with (Error object, traceback) 
     elif type(msg) == tuple and isinstance(msg[0], Exception):               
      return msg 
     else: 
      sys.stderr.write(u"Illegal message type received from child process") 
    else: 
     time.sleep(0.1) 

,

msg = self.channel.get(False) 

콘솔의 출력으로 없음을 인쇄하지 나타나는는

Retrieving message 
None 
Message received 

인 그 후에, msg에 포함 된 튜플은 올바른 정보가 수신되었음을 나타내는대로 처리됩니다. Tuple을받을 때 Queue.get() 함수의 어딘가에 None이 인쇄 된 것 같습니다. 어쨌든 출력을 억제하거나 수정해야합니까?

답변

0

일반적으로 stdout에 인쇄하는 일부 기능이있는 경우 출력을 억제하려면 sys.stdout을 일시적으로 다시 정의 할 수 있습니다. 다음 예는 다음과 같습니다

def f(text): 
    print(text) 

import sys 
import StringIO 

saved = sys.stdout    # Save. 
sys.stdout = StringIO.StringIO() # Redefine. 
f('first')      # Will not print. 
sys.stdout = saved    # Recover. 
f('second')      # Will print. 

출력은 다음과 같습니다

second 

그리고 경우에 당신은 stdout 또는 stderr에 기능 인쇄, 당신은 둘 다 억제 할 수 있는지 확실하지 :

import sys 
from StringIO import StringIO 

saved = sys.stdout, sys.stderr 
sys.stdout, sys.stderr = StringIO(), StringIO() 
f('first') 
sys.stdout, sys.stderr = saved 
f('second') 

을 그게 너에게 효과가 있니?

+0

이것은 속임수입니다. 감사합니다. 이 자원은 비싸지 않습니까? 최소한 StringIO 객체는 루프가 시작되기 전에 한 번 만들어지고 루프 내에서 참조되는 것입니다. Queue.get()이 파이썬 라이브러리에 심각한 버그를 인쇄하지 않는다는 사실입니까? 귀하의 솔루션은 간단하고 효과적이지만, 불필요한 추악한 해킹 인 것처럼 보입니다. –

+0

위대한, 다행 당신을 위해 일했다. GUI 애플리케이션의 모습을 보면 시스템 리소스가 고갈되지 않는다고 추측 할 수 있습니다. 코드에서''time.sleep()' '을 사용하지 않는 방법을 찾는 것이 더 중요합니다.) 도서관의 심각한 버그? 아마. 내 해결책 해킹? 명확히. 추한? 당신은''다중 처리 (multiprocessing) ''모듈 C 코드를 디버깅하고 수정하는 것과 반대되는 것을 의미합니까? –

+0

나는 잠시 동안 프로세스를 일시 중지하고 채널의 메시지를 지속적으로 확인하지 않도록 time.sleep을 사용했다.이 작업을 수행하는 올바른 방법이라고 생각했지만 틀릴 수도있다. 파이썬 C 코드를 디버깅하는 것은 사실 나를위한 선택 사항이 아니므로이 방법을 사용하면됩니다. 감사! –

관련 문제