티스토리 뷰

발생일: 2018.09.29

키워드: Jupyter notebook, nbconvert to HTML

문제:

작성한 주피터 노트북을 팀내에 공유하거나 배치로 메일 등으로 발송하게 하려고 한다.
nbconvert 모듈로 HTML이나 PDF 포맷으로 export 할 수 있다는 건 알고 있다.

$ jupyter nbconvert --to html sample.ipynb --output output.html

이렇게 처리했는데, 생성된 HTML이 정말 못생겼다.

좀 예쁘게 바꾸고 싶은데, 어떻게 하면 될까?


해결책:

nbconvert 모듈로 export 할 때, --template 옵션으로 별도의 템플릿을 적용해 출력 형태를 바꿀 수 있다.

$ jupyter nbconvert --to html sample.ipynb --template=basic.tpl --output output.html

템플릿을 적용해 변환하는 것에 대한 설명은 아래 포스트에 쉽게 잘 정리되어 있다.


기본적인 방법은 위 포스트 뿐 아니라 구글링 결과도 많다.
여기엔 상세하게 스타일을 설정하려고 할 때 참고할 만한 자료에 대해 정리해뒀다.


템플릿 엔진

먼저, nbconvert 모듈은 파이썬의 주요 템플릿 엔진인 Jinja 템플릿을 쓴다.
스타일을 변경하거나 원하는 템플릿만 출력하는 정도만 활용하면 되며, 아래 링크의 템플릿 문법만 알아두면 된다.


템플릿 구조

주피터 노트북을 컨버팅할 때, 템플릿의 구조를 알아야 상세하게 설정할 수 있겠더라.
템플릿의 구조는 아래 문서를 확인하면 된다.


부모 템플릿

하위 템플릿에서 상속한 상위 템플릿의 상세 구조를 알아야 하는 경우가 있었다.
내가 사용하기엔 기본 제공되는 basic.tpl 은 너무 간소했고, full.tpl 은 너무 과했다.

이럴 땐 basic.tpl 의 일부만 따서, 원하는 템플릿을 만들면 된다.
상위 템플릿 파일은 아래 링크에서 확인할 수 있다.

basic.tpl 파일

full.tpl 파일


테마 모음

주피터 노트북 테마가 없을 리가 없다.ㅎㅎ
주피터 노트북의 테마까지 변경할 수 있고, 어떤 모듈은 프로필까지 적용해준다.

그 중 괜찮아 보이는 모듈을 찾았다.

난 일단 목적에 충실하기 위해 스타일만 가져다 적용해봤다. HTML 아웃풋도 예쁘게 잘 나온다.

그렇지만, 난 깃헙 스타일이 제일 좋더라!

A Github Flavored Theme for Ipython or Jupyter Notebook



스크립트 적용

full.tpl 은 기본적으로 jQuery를 임베딩하고 있다.
난 스태틱한 페이지를 만들기 위해 스크립트를 제거했는데, 필요에 따라 활용하는 것도 좋다.

아래는 output이 토글되게 적용한 샘플이다.


TemplateExporter

템플릿 파일에서 셀의 출력 방식을 변경하거나 원하지 않은 경우 빈 값으로 렌더링할 수 있다.
하지만, nbconvert 명령에서 TemplateExporter 옵션으로도 제거할 수 있다.

난 input 영역과 output 의 숫자 출력 부분을 제거하고 싶어 아래와 같이 실행했다.

$ jupyter nbconvert --to html .ipynb --template=sample.tpl --TemplateExporter.exclude_input=True --TemplateExporter.exclude_output_prompt=True --output output.html

TemplateExporter 로 제거할 수 있는 항목은 아래 문서를 참고하면 된다.

추가로, 용어가 좀 헷갈려서 설명 이미지를 만들었다.



노트북을 새로 실행하면서 변환

노트북을 새로 실행하면서 생성하려면 --execute 옵션을 주면 된다.

$ jupyter nbconvert --to html .ipynb --execute  --output output.html



최종

아래 이미지는 기본 컨버팅 결과와 템플릿을 다듬어서 출력한 결과를 비교해둔 것이다.
손본 게 확실히 예뿌다.ㅎㅎㅎ


수정한 템플릿 파일은 아래 gist를 참고하면 된다.

컨버팅할 때 실행한 명령은 다음과 같다.

$ jupyter nbconvert --to html .ipynb --template=sample.tpl --TemplateExporter.exclude_input=True --TemplateExporter.exclude_output_prompt=True --output output.html



반응형
댓글
공지사항