2016-12-27 6 views
1

저는 Python 3 커널과 함께 Jupyter 노트북을 사용하고 있습니다.라이브러리 캡처 f2py ipython에서 stdout 호출

나는 실행하는 경우 :

import scipy.optimize 
scipy.optimize.minimize(
    lambda _: 1, 
    0, 
    method='COBYLA', 
    options={'iprint': 1, 'disp': True, 'maxiter': 2}) 

내가 ipython 노트북에 인쇄 진단 최적화 정보를 얻을 것으로 기대합니다. 그러나 이것은 콘솔에 인쇄됩니다. 최적화 루틴이 Fortran에서 구현되고 f2py를 통해 scipy에서 인터페이싱되기 때문에 이것이 맞는 것 같습니다. COBYLA Fortran 파일이 실제 인쇄를 수행합니다.

포트란 서브 루틴 출력을 ipython 노트북으로 파이프하는 방법은 무엇입니까? 내가 이해할 때 컴파일 된 C 함수를 호출하는 것과 동일해야합니다. 그렇다면 표준 출력이 공유되지 않는 이유는 무엇입니까?

답변

2

짧은 대답은 당신이 할 수 없다는 것입니다. 쉽게. 그 중 하나는 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

+0

Darn이 될 수 있습니다. 그러나 jupyter는 정규 stdout (즉 print())을 캡처합니다. 커널 stdout을 파이프하기 때문입니다. Jupyter가 파이썬 레벨에서 stdout을 잡는 파이 커널에 마술을 주입한다고 말하는 것입니까? 그건 좀 더 복잡해 보이고 f2py, pyc 등과 같은 것들을 잡는 것을 막는다. (비록 그것이 "기능"이라고 생각된다.) – VF1

+0

답변을 확대했습니다. 프로세스 레벨에서의 캡처는 쉽지 않습니다 (https://github.com/jupyterhub/sudospawner/pull/14/files). 경합 조건/스레드가 더 어려울 수 있습니다. 복잡한 Jupyter/IPython 구분도 있습니다. – Matt

+0

프로세스 수준 스트림 캡처의 단점은 무엇입니까? 나는 당신이 선호한다면 별도로 질문 할 수있다. – VF1