짧은 대답은 당신이 할 수 없다는 것입니다. 쉽게. 그 중 하나는 IPython/Jupyter 프로토콜에 다음 enhancement proposal이 포함될 수있는 사용 사례입니다. 그것은 아직 받아 들여지지 않았지만 빨리 일어나지는 않습니다.
(손 흔들기) 이유는 파이썬을 사용하면 sys.stdin/sys.stdout/sys.stderr을 monkeypatch하고 "Right Thing"™을 수행하도록 리디렉션하는 파일 형 인터페이스에 쓸 수 있다는 것입니다 그것은 fortran/c/... 함수이기 때문에 원시 스트림에 해당하는 파일 핸들을 직접 열 때가 많습니다. 사실 이후에는 변경할 수 없습니다.
유일한 해결책은 프로세스가 시작되는 방식을 제어하고 파일 설명자를 미리 변경하는 것이므로 "커널 nany"에 대한 제안입니다.
(OP 추가 질문 후) 개발하겠습니다.
파이썬 print
은 표준 출력에 직접 인쇄하지 않는 기능이며 달리 언급하지 않는 한 실제로 sys.stdout
에 쓰는 기능입니다. 보통 파이썬 셸을 체크인하면 :
>>> import sys
>>> sys.stdout
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
파일 핸들 주위에 직접 래퍼가 있음을 알 수 있습니다.
노트북에서 (IPython 단말기가 아닌 다른 이야기에서) 똑같이하면, <ipykernel.iostream.OutStream at 0x104602be0>
이 ZMQ 프로토콜 주변의 프록시 객체입니다. IPython 커널에서 이전 스트림은 그래서 당신이 놀러와 노트북 서버의 터미널에 "안녕하세요 유래"를 인쇄하는
sys.__stdout__.write('Hello StackOverflow\n')
을 시도 할 수 sys.__stdout__
에 저장됩니다. 스트림을 플러시하도록 트리거하는 \n
을 잊지 마세요.
Jupyter 동작이 아니라 IPython 동작입니다. 주피터 측은 ZMQ를 통해 stdout을 보내는 한 당신이 어떻게하는지 신경 쓰지 않습니다. Haskell 커널은 자신의 io
모듈을 제공함으로써 동일하게 작동 할 것입니다. 과정 stdout
캡처
는
하나 개의 솔루션 (커널 유모 제안을 덮는)이지만 자신의 단점이 있습니다. sys.stdout
이 만들어지기 때문에 파이썬 수준에서 리디렉션하는 것이 더 간단합니다.
이 문제는 버그도 아니고 "기능", 하나 등, 그 서브 프로세스/f2py/PYC를 주장 할 수도는 ...인수로 비표준 stdout/stderr를 처리 할 수 있어야하며 nanny
은
Darn이 될 수 있습니다. 그러나 jupyter는 정규 stdout (즉 print())을 캡처합니다. 커널 stdout을 파이프하기 때문입니다. Jupyter가 파이썬 레벨에서 stdout을 잡는 파이 커널에 마술을 주입한다고 말하는 것입니까? 그건 좀 더 복잡해 보이고 f2py, pyc 등과 같은 것들을 잡는 것을 막는다. (비록 그것이 "기능"이라고 생각된다.) – VF1
답변을 확대했습니다. 프로세스 레벨에서의 캡처는 쉽지 않습니다 (https://github.com/jupyterhub/sudospawner/pull/14/files). 경합 조건/스레드가 더 어려울 수 있습니다. 복잡한 Jupyter/IPython 구분도 있습니다. – Matt
프로세스 수준 스트림 캡처의 단점은 무엇입니까? 나는 당신이 선호한다면 별도로 질문 할 수있다. – VF1