복붙노트

[PYTHON] 파이썬의 인터프리터 출력을 캡처하고 텍스트 위젯에 표시하는 방법?

PYTHON

파이썬의 인터프리터 출력을 캡처하고 텍스트 위젯에 표시하는 방법?

필자는 Python으로 PyQt와 함께 Windows에서 실행되도록 설계된 프로그램을 가지고있다. 이 프로그램은 많은 작업을 수행하고 많은 정보를 인쇄합니다. 그러나 그것을 멈추고 프롬프트 화면이 나타나기를 원하지 않기 때문에 QTextEdit 또는 그와 같은 메인 애플리케이션에 모든 정보가 나타납니다. 어떻게 프로그램을 작동 시켜서 인터프리터의 출력을 얻고 실제 인터프리터 에서처럼 텍스트 편집기에서 동시에 출력 할 수 있습니까?

해결법

  1. ==============================

    1.필자는 "인터프리터의 출력"을 통해, 콘솔이나 터미널 창에 출력되는 출력을 의미합니다 (예 : print ()로 생성 된 출력).

    필자는 "인터프리터의 출력"을 통해, 콘솔이나 터미널 창에 출력되는 출력을 의미합니다 (예 : print ()로 생성 된 출력).

    파이썬에 의해 생성 된 모든 콘솔 출력은 프로그램의 출력 스트림 sys.stdout (일반 출력) 및 sys.stderr (예외 추적 출력과 같은 오류 출력)에 기록됩니다. 이것들은 파일과 같은 객체입니다.

    이러한 스트림을 자신의 파일과 유사한 객체로 바꿀 수 있습니다. 모든 사용자 정의 구현은 쓰기 (텍스트) 기능을 제공해야합니다. 직접 구현을 제공하면 모든 출력을 위젯에 전달할 수 있습니다.

    class MyStream(object):
        def write(self, text):
            # Add text to a QTextEdit...
    
    sys.stdout = MyStream()
    sys.stderr = MyStream()
    

    이러한 스트림을 재설정해야하는 경우에도 sys .__ stdout__ 및 sys .__ stderr__으로 계속 사용할 수 있습니다.

    sys.stdout = sys.__stdout__
    sys.stderr = sys.__stderr__
    

    최신 정보

    다음은 PyQt4의 작동 코드입니다. 먼저 Qt 신호로 기록 된 데이터를보고하는 스트림을 정의하십시오.

    from PyQt4 import QtCore
    
    class EmittingStream(QtCore.QObject):
    
        textWritten = QtCore.pyqtSignal(str)
    
        def write(self, text):
            self.textWritten.emit(str(text))
    

    이제 GUI에서 sys.stdout에이 스트림의 인스턴스를 설치하고 텍스트를 QTextEdit에 쓰는 슬롯에 textWritten 신호를 연결합니다.

    # Within your main window class...
    
    def __init__(self, parent=None, **kwargs):
        # ...
    
        # Install the custom output stream
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
    
    def __del__(self):
        # Restore sys.stdout
        sys.stdout = sys.__stdout__
    
    def normalOutputWritten(self, text):
        """Append text to the QTextEdit."""
        # Maybe QTextEdit.append() works as well, but this is how I do it:
        cursor = self.textEdit.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.textEdit.setTextCursor(cursor)
        self.textEdit.ensureCursorVisible()
    
  2. ==============================

    2.불행히도이 예제는 PySide에서 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

    불행히도이 예제는 PySide에서 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

    sys.stdout = EmittingStream(textWritten=self.write2Console)
    AttributeError: 'textWritten()' is not a Qt property or a signal
    

    우리는 PySide와 함께 동작하기 위해 다음과 같이 변경해야한다.

    sys.stdout = EmittingStream()
    self.connect(sys.stdout,QtCore.SIGNAL('textWritten(QString)'),self.write2Console)
    
  3. ==============================

    3.로깅 라이브러리를 사용하는 것이 좋습니다. http://docs.python.org/library/logging.html QTextEdit과 통신하기위한 자체 로그 핸들러를 작성할 수 있습니다. 시작하기에 좋은 튜토리얼은 다음과 같습니다. http://pantburk.info/?blog=77

    로깅 라이브러리를 사용하는 것이 좋습니다. http://docs.python.org/library/logging.html QTextEdit과 통신하기위한 자체 로그 핸들러를 작성할 수 있습니다. 시작하기에 좋은 튜토리얼은 다음과 같습니다. http://pantburk.info/?blog=77

  4. ==============================

    4.PySide의 터미널 응용 프로그램에 대한 내용을 PySide의 app과 같이 게시했습니다. PyQt를보고 있다면 PySide도 확인하십시오. 라이센스와 구문의 몇 가지 차이점을 제외하고는 기본적으로 같은 것입니다.

    PySide의 터미널 응용 프로그램에 대한 내용을 PySide의 app과 같이 게시했습니다. PyQt를보고 있다면 PySide도 확인하십시오. 라이센스와 구문의 몇 가지 차이점을 제외하고는 기본적으로 같은 것입니다.

  5. from https://stackoverflow.com/questions/8356336/how-to-capture-output-of-pythons-interpreter-and-show-in-a-text-widget by cc-by-sa and MIT license