Ho il seguente che funziona con IPython 2.0. Ho osservato che il nome del taccuino è memorizzato come valore dell'attributo 'data-notebook-name'
nel <body>
tag della pagina. Quindi l'idea è prima di chiedere a Javascript di recuperare l'attributo --javascripts può essere invocato da una codecell grazie alla %%javascript
magia. Successivamente è possibile accedere alla variabile Javascript tramite una chiamata al Kernel Python, con un comando che imposta una variabile Python. Poiché quest'ultima variabile è nota dal kernel, è possibile accedervi anche in altre celle.
%%javascript
var kernel = IPython.notebook.kernel;
var body = document.body,
attribs = body.attributes;
var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'";
kernel.execute(command);
Da una cella di codice Python
print(theNotebook)
Out []: HowToGetTheNameOfTheNoteBook.ipynb
Un difetto di questa soluzione è che quando si cambia il titolo (nome) di un notebook, questo nome sembra non essere aggiornato immediatamente (probabilmente c'è una sorta di cache) ed è necessario ricaricare il notebook per accedere al nuovo nome.
[Modifica] Riflettendoci, una soluzione più efficiente è cercare il campo di input per il nome del taccuino invece del <body>
tag. Esaminando l'origine, sembra che questo campo abbia l'ID "notebook_name". È quindi possibile catturare questo valore con a document.getElementById()
e quindi seguire lo stesso approccio di cui sopra. Il codice diventa, ancora usando la magia di javascript
%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "'"+thename+"'";
kernel.execute(command);
Quindi, da una cella ipython,
In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis
Contrariamente alla prima soluzione, le modifiche al nome del notebook vengono aggiornate immediatamente e non è necessario aggiornare il notebook.