IPython : 파이썬 스크립트의 출력을 파일로 리디렉션합니다 (예 : bash>).


Answers

IPython은 stdout / err캡쳐 할 수있는 자체 컨텍스트 관리자를 가지고 있지만 파일로 리다이렉트하지 않고 객체로 리다이렉트한다.

from IPython.utils import io
with io.capture_output() as captured:
    %run my_script.py

print captured.stdout # prints stdout from your script

그리고이 기능은 Cell Magics 예제 노트북 에서 설명한 것처럼 %%capture 셀 마술에 노출됩니다.

간단한 컨텍스트 관리자이기 때문에 파일로 리디렉션되는 고유 한 버전을 작성할 수 있습니다.

class redirect_output(object):
    """context manager for reditrecting stdout/err to files"""


    def __init__(self, stdout='', stderr=''):
        self.stdout = stdout
        self.stderr = stderr

    def __enter__(self):
        self.sys_stdout = sys.stdout
        self.sys_stderr = sys.stderr

        if self.stdout:
            sys.stdout = open(self.stdout, 'w')
        if self.stderr:
            if self.stderr == self.stdout:
                sys.stderr = sys.stdout
            else:
                sys.stderr = open(self.stderr, 'w')

    def __exit__(self, exc_type, exc_value, traceback):
        sys.stdout = self.sys_stdout
        sys.stderr = self.sys_stderr

당신은 다음과 같이 호출 할 것입니다 :

with redirect_output("my_output.txt"):
    %run my_script.py
Question

나는 IPython에서 실행하고 싶은 Python 스크립트를 가지고있다. 출력을 파일로 리디렉션 (쓰기)하고 싶습니다.

python my_script.py > my_output.txt

어떻게 IPython에서 스크립트를 실행할 때 이렇게합니까, 예를 들어 execfile('my_script.py')

이 작업을 수행 할 수있는 함수를 설명하는 이전 페이지가 있지만, 지금은 찾을 수없는 내장 된 방법이 있다고 생각합니다.







sys.stdoutsys.stderr 을 파일 객체로 덮어 쓰는 sys.stdout 방법이 있습니다. 그러나 실제로 그것에 대해 좋은 방법이 아닙니다. 파이썬 내부에서 출력이 어디로 가야 하는지를 제어하려면 print 문 대신 명령 행이나 함수 인수를 사용하여 구성 할 수있는 일종의 로깅 및 / 또는 출력 처리 시스템을 구현해야합니다.




필자는 IPython에서 작업하는 동안 변수에 포함 된 많은 텍스트를 간단하게보고 싶었 기 때문에 스크립트 작성은 과도한 것처럼 보였다. 이것이 나를 위해 일한 것입니다.

%store VARIABLE >> file.txt (추가).
%store VARIABLE > file.txt (덮어 쓰기)