2016-07-07 3 views
0

IPython의 포함 된 포격 기능을 사용하는 스크립트에서 작업 중이며 요구 사항으로 stdin/stdout의 모든 데이터를 파일에 기록해야합니다 . 이런 이유로 나는 그들을 위해 래퍼를 쓰기로 결정했다; 나는 래퍼가 어떻게 든를 인식 IPython을 방지 같은데요stdin/stdout을 래핑하면 IPython이 자동 완성 및 기록 기능을 잃게됩니다.

In [1]: ^[[A^[[B^[[A^[[C... 

: 그러나, 스트림을 전환 한 후 내 임베디드 IPython 쉘 내가 화살표 버튼을 누를 때 이런 식으로 뭔가를 출력의 자동 완성과 역사 기능을 상실 UP, DOWN, LEFT 및 RIGHT 화살표 (ESC[#A, ESC[#B, ESC[#C, ESC[#D)에 사용되는 ANSI 이스케이프 시퀀스입니다. 이것이 해결 될 수있는 방법에

import sys 
from time import strftime 
import IPython 

# Custom IO class for file logging 
class StdinLogger (object): 
    def __init__(self, wrapped, file): 
     # double-underscore everything to prevent clashes with names of 
     # attributes on the wrapped stream object. 
     self.__wrapped = wrapped 
     self.__file = file 

    def __getattr__(self, name): 
     return getattr(self.__wrapped, name) 

    def readline(self): 
     str = self.__wrapped.readline() 
     self.__file.write(str) 
     self.__file.flush() 
     return str 


# Custom IO class for file logging 
class StdoutLogger (object): 
    def __init__(self, wrapped, file): 
     # double-underscore everything to prevent clashes with names of 
     # attributes on the wrapped stream object. 
     self.__wrapped = wrapped 
     self.__file = file 

    def __getattr__(self, item): 
     return getattr(self.__wrapped, item) 

    def write(self, str): 
     self.__file.write(str) 
     self.__file.flush() 
     self.__wrapped.write(str) 
     self.__wrapped.flush() 


f = open("LOG-" + strftime("%Y-%m-%d-%H-%M-%S") + ".txt", 'w') 
# Initialize the file logger 
sys.stdin = StdinLogger(sys.stdin, f) 
sys.stdout = StdoutLogger(sys.stdout, f) 


# Embed IPython shell 
IPython.embed(banner1="", banner2="") 

어떤 아이디어 : 여기

내 문제를 보여주는 코드입니다?

미리 감사드립니다.

Carreau의 (IPython 핵심 개발자) @

답변

0

Github에서이 문제에 대한 응답 :

문제는 특히 프롬프트 툴킷 표준 출력으로 말 그대로// 삭제 그릴에 다시 그리기로, 스트림에 비해 더 있다는 것입니다 화면 및 이벤트 루프 및 비동기 완료를 사용하므로 stdin/out/err을 현재 상태를 알기에 충분하다고 간주 할 수 없습니다.

prompt_toolkit에 연결해야하고 은 vt100 입력/출력 및/또는 windows 입력을 덮어 씁니다.

우리는 IPython에서 시작시 설정하기 위해 추가 후크가 필요할 것입니다.