2014-09-26 2 views
13

로컬 드라이브에 임베드 된 이미지가있는 ipython 노트북이 있습니다. 코드 셀의 출력과 함께 JSON에 임베딩 될 것으로 기대했지만, 노트북을 배포하면 이미지가 사용자에게 표시되지 않았습니다. 노트북에 이미지를 삽입하는 권장 방법은 무엇입니까? 사용자가 코드 셀을 다시 실행하거나 셀 출력을 지우는 등의 작업을 수행 할 때 사라지지 않도록하려면 어떻게해야합니까?분배를 위해 ipython 노트북에 이미지 임베드

노트북 시스템은 ![label](image.png)에 포함 된 이미지를 캐시하지만 노트북을 제공하는 "커널"이 다시 시작될 때까지만 지속됩니다. 디스크에있는 이미지 파일의 이름을 변경하면 노트북을 닫았다가 다시 열 수 있으며 여전히 이미지가 표시됩니다. 커널을 다시 시작하면 사라집니다.

편집 : 코드 셀 출력로 화상을 생성하고 HTML로 노트북을 보내면 상기 화상 부호화 데이터와 HTML에 포함된다. 분명히이 기능에 연결하여 출력을 마크 다운 (또는 더 나은 "원시 nbconvert") 셀에로드하는 방법이 있어야합니까?

from IPython.display import Image 
Image(filename='imagename.png') 

는 다음과 같은 포함 된 HTML로 (ipython nbconvert로) 내보낼 그러나

<div class="output_png output_subarea output_execute_result"> 
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA... 
</div> 

, 내가 수동으로 인하 셀에 조각을 포함해도에게, 나는를 가져올 수 없습니다 표시 할 이미지. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

PS 기존의 (오래된) 대답은 몇 가지 유용한 포인터를 제공하지만 해결책은 아닙니다.

+0

아무도이 시간에이 질문에 대답하지 못했습니다. 아마도 지금까지 해결책이 있을까요? – alexis

+0

동일한 문제가 발생했습니다. 분명히 ' tel

+0

Yeah, that's reasonable, and I had expected some sort of filter. Actually I'd be surprised if originally there was no filter at all-- it's more likely that was just strengthened in version 2. But the question is still, _is_ there some method that gets past the filters? – alexis

답변

5

이미지를 표시하기 위해 추가 코드 셀을 사용해도 좋습니까? 그렇다면, 이것을 사용 : 당신이 그것을 공유 할 수있는 이미지가 유지 될 수 있도록

from IPython.display import Image 
Image(filename="example.png") 

출력 셀은 .ipynb 파일에 포함 된 원시 이미지 데이터를해야합니다. Image 클래스도 url 키워드를 가지고

참고하지만, 이미지에이 의지 만 링크 당신은 또한 embed=True를 지정하지 않은 경우 (자세한 내용은 documentation 참조). 따라서 원격 서버의 이미지를 언급하지 않는 한 filename 키워드를 사용하는 것이 더 안전합니다.

삽입 된 이미지 데이터를 생성하기 위해 별도의 코드 셀을 사용하지 않고 Markdown 셀에 이미지를 포함해야하는 경우 쉬운 솔루션이 있는지 확실하지 않습니다. 마킹 셀에 Python 변수의 내용을 동적으로 표시 할 수있는 python markdown extension을 사용할 수 있습니다. 그러나 확장 기능은 마더 다운 셀을 동적으로 생성하므로 노트북을 공유 할 때 출력을 유지하려면 "설치"절에서 설명한대로 전 처리기를 사용하여 ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook을 실행해야합니다. 그런 다음 생성 된 노트는 형식의 HTML 태그로 마크 다운 셀에 데이터를 포함하므로 preprocessed_notebook.ipynb에서 해당 코드 셀을 삭제할 수 있습니다. 불행히도 이것을 시도했을 때 <img> 태그의 내용이 브라우저에 실제로 표시되지 않았으므로 실행 가능한 솔루션인지 확실하지 않았습니다. :/

다른 옵션은 코드 셀에서 Image 클래스를 사용하여 위와 같이 이미지를 생성 한 다음 nbconvert을 사용자 지정 서식 파일과 함께 사용하여 전자 필기장에서 코드 입력 셀을 제거하는 것입니다.자세한 내용은 this thread을 참조하십시오. 그러나 이렇게하면 변환 된 노트의 모두 코드 셀이 제거되므로 원하는 내용이 아닐 수도 있습니다.

+0

Thanks! I don't _require_ the image to be in a markdown cell, but using code is (a) distracting, since the code cell cannot be hidden; and (b) more crucially, it's unsafe because these are notebooks for programming practice and the user can be expectedto clear cell outputs now and then. – alexis

+0

PS. Thanks for the nbconvert thread... I've been gradually piling up my own conversion scripts because nbconvert's guts are completely opaque (and not very well documented). Maybe this will lead me to a source of better explanations. – alexis

+0

Not sure if this is relevant, but maybe [this example](https://github.com/maxalbert/auto-exec-notebook) can also be helpful to better understand 'nbconvert' and automated notebook execution. I haven't looked at it in detail, but in my limited experience the nbconvert machinery seems to be relatively tidy in the latest version of IPython (and potentially simpler than in previous versions due to the simplification of the notebook format itself). – cilix

2

당신이 인하 세포에 넣어 때

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA... 

태그가 아무것도하지 않는 이유는 IPython 태그의 유형을 가려하는 HTML 소독제 (Google Caja라는 것을)를 사용하기 때문에 (그리고 다른 많은 것들) 렌더링 될 수 있습니다.

IPython의 HTML 소독제가 완전히 (보통 ~/.ipython/profile_default/static/custom/custom.js에 있음) custom.js 파일에 다음 줄을 추가하여 비활성화 할 수 있습니다

:

iPython.security.sanitize_html = function (html) { return html; }; 

보안 위험을 만들처럼 그것은하지만 좋은 해결책이 아니다 , 그리고 그것은 배포에 많은 도움이되지 않습니다.

포스트 스크립트 :
이미지 = 명백한 보안 문제로 base64로 인코딩 된 문자열을 렌더링하는, 그래서 the related feature request ticket 먼저 다시 열렸다 있지만 카하 사람들은 결국 (을 통해 이런 종류의 물건을 할 수있는 방법이 있어야하는 능력! 2012 년에는 숨을 멈추지 마십시오.)

+1

That's a good lead! Notebooks have a concept of "trusted" notebook, implemented (I think) as a cryptographic key once a notebook has been inspected by the user. The reasonable thing to do would be to relax html sanitizing for trusted notebooks. Any ideas on how this could be set up? – alexis

+1

@alexis *le sigh* I tried that too. Clicking though the 'File -> 신뢰 노트'메뉴 대화 상자를 입력하는 것이 HTML 위생 처리에 영향을 미치지 않는 것 같습니다. 그래야 할 것 같아. 나는 이것이 IPython 코드베이스에서 구현되어야한다고 상상한다. 아마 너 아니면 내가 풀 요청을 제출할 것인가? – tel

+0

아니, 나는이 조건을 신뢰할 수있는 속성 (또는 실제로 넣을 위치)으로 만드는 방법을 모를 것이다. 그리고 나는 완전하게 비활성화 된 위생 처리가 옳다는 것을 확신하지 못합니다. 기능의 더 큰 화이트리스트가 있어야합니다. 개발자가 충분히 관심이 있다면 개발자가 아이디어를 얻는 지 확인하는 것이 매우 흥미로울 것입니다. – alexis

관련 문제