2014-09-26 20 views
13

Ho un notebook ipython con un'immagine incorporata dalla mia unità locale. Mi aspettavo che fosse incorporato nel JSON insieme all'output delle celle di codice, ma quando ho distribuito il notebook, l'immagine non appariva agli utenti. Qual è il modo consigliato (o modi) di incorporare un'immagine in un Notebook, in modo che non scompaia se gli utenti rieseguono le celle di codice, cancellano l'output della cella, ecc.?Immagine di incorporamento nel notebook ipython per la distribuzione

Il sistema del notebook memorizza nella cache le immagini incluse con ![label](image.png), ma durano solo fino al riavvio del "kernel" python che serve il notebook. Se rinominare il file immagine su disco, posso chiudere e riaprire il notebook e mostra ancora l'immagine; ma scompare quando riavvio il kernel.

Edit: Se genero un'immagine come cella di codice uscita e quindi esportare il notebook in formato HTML, l'immagine è incorporato nel codice HTML come dati codificati. Sicuramente ci deve essere un modo per collegare questa funzionalità e caricare l'output in una cella markdown (o meglio ancora "raw nbconvert")?

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

verranno esportati (con ipython nbconvert) per HTML contenente il seguente:

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

Tuttavia, anche quando ho inserito manualmente questo frammento di codice in una cella Markdown, non ho potuto ottenere il immagine da visualizzare. Che cosa sto facendo di sbagliato?

PS La risposta esistente (vecchia) fornisce alcuni indicatori molto utili, ma non una soluzione.

+0

Peccato che nessuno abbia risposto a questa domanda in tutto questo tempo! C'è forse una soluzione ormai? – alexis

+0

Ho incontrato esattamente lo stesso problema. Apparentemente, il motivo per cui entrare nella finestra di dialogo del menu 'Trust Notebook' 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

risposta

5

Sei felice di utilizzare una cella di codice aggiuntiva per visualizzare l'immagine? In tal caso, utilizzare questo:

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

La cella di uscita avrà i dati di immagine grezzi incorporati nel file .ipynb in modo da poter condividere e l'immagine vengono mantenuti.

Nota che la classe Image ha anche una parola chiave url, ma questo sarà solo collegamento all'immagine meno che non si specifichi anche embed=True (vedi la documentation per i dettagli). Quindi è più sicuro usare la parola chiave filename a meno che tu non stia facendo riferimento a un'immagine su un server remoto.

Non sono sicuro se esiste una soluzione semplice se si desidera che l'immagine sia inclusa in una cella Markdown, ovvero senza una cella di codice separata per generare i dati dell'immagine incorporata. Potresti essere in grado di utilizzare lo python markdown extension che consente di visualizzare dinamicamente il contenuto delle variabili Python nelle celle di markdown. Tuttavia, l'estensione genera dinamicamente le celle di markdown, quindi per conservare l'output durante la condivisione del notebook è necessario eseguire ipython nbconvert --to notebook original_notebook.ipynb --output preprocessed_notebook utilizzando il preprocessore pymdpreprocessor.py come indicato nella sezione "Installazione". Il taccuino generato ha quindi i dati incorporati nella cella di markdown come tag HTML del modulo <img src="data:image/png;base64,..."> in modo da poter eliminare la cella di codice corrispondente da preprocessed_notebook.ipynb. Sfortunatamente, quando ho provato questo il contenuto del tag <img> non veniva effettivamente visualizzato nel browser, quindi non sono sicuro che questa sia una soluzione valida. : -/

Un'opzione diversa sarebbe quella di utilizzare la classe Image in una cella di codice per generare l'immagine come sopra, e quindi utilizzare nbconvert con un modello personalizzato per rimuovere le celle di input del codice dal notebook.Vedi this thread per i dettagli. Tuttavia, questo rimuoverà tutte le celle di codice dal notebook convertito, quindi potrebbe non essere quello che desideri.

+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

Il motivo per cui il tag

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

non fa nulla quando lo metti in una cella di mark-down è perché IPython utilizza un HTML disinfettante (qualcosa chiamato Google Caja) che scherma questo tipo di tag (e molti altri) prima che possa essere reso.

Il disinfettante HTML in IPython può essere completamente disabilitato aggiungendo la seguente riga al custom.js del file (di solito si trova a ~/.ipython/profile_default/static/custom/custom.js):

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

Non è una grande soluzione, però, come fa creare un rischio per la sicurezza e in realtà non aiuta molto con la distribuzione.

Postscript:
la capacità di rendere base64 stringhe codificate come immagini = ovvio problema di sicurezza, quindi non ci dovrebbe essere un modo per le persone Caja per consentire alla fine questo genere di cose attraverso (anche se the related feature request ticket è stato aperto prima di nuovo! nel 2012, quindi non trattenere il respiro).

+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 -> non sembra influire sull'igienizzazione dell'HTML in un modo o nell'altro. Hai ragione che dovrebbe, però. Immagino che dovrà essere implementato nella base di codice IPython. Forse tu o io andremo in giro a presentare una richiesta di pull? – tel

+0

Non io, non avrei idea di come rendere questo condizionale sulla proprietà attendibile (o dove metterlo, in realtà). E non sono sicuro che disabilitare completamente la sanitizzazione sia giusto ... dovrebbe esserci una whitelist più ampia di funzioni che sono lasciate passare. Se sei sufficientemente interessato a farlo, sarei molto curioso di vedere se gli sviluppatori prendono l'idea! – alexis

Problemi correlati