Ich habe die folgenden, die mit IPython 2.0 funktioniert. Ich habe festgestellt, dass der Name des Notizbuchs als Wert des Attributs 'data-notebook-name'
im <body>
Tag der Seite gespeichert ist . Daher besteht die Idee darin, zuerst Javascript zu bitten, das Attribut abzurufen - Javascripts können dank der %%javascript
Magie aus einer Codezelle aufgerufen werden . Anschließend können Sie über einen Aufruf des Python-Kernels mit einem Befehl, der eine Python-Variable festlegt, auf die Javascript-Variable zugreifen. Da diese letzte Variable aus dem Kernel bekannt ist, kann auch in anderen Zellen darauf zugegriffen werden.
%%javascript
var kernel = IPython.notebook.kernel;
var body = document.body,
attribs = body.attributes;
var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'";
kernel.execute(command);
Aus einer Python-Codezelle
print(theNotebook)
Out []: HowToGetTheNameOfTheNoteBook.ipynb
Ein Fehler in dieser Lösung besteht darin, dass, wenn man den Titel (Namen) eines Notizbuchs ändert, dieser Name nicht sofort aktualisiert zu werden scheint (es gibt wahrscheinlich eine Art Cache) und das Notizbuch neu geladen werden muss, um Zugriff auf das zu erhalten neuer Name.
[Bearbeiten] Bei der Reflexion besteht eine effizientere Lösung darin, anstelle des <body>
Tags nach dem Eingabefeld für den Namen des Notebooks zu suchen . Wenn Sie sich die Quelle ansehen, scheint dieses Feld die ID "notebook_name" zu haben. Es ist dann möglich, diesen Wert mit a zu erfassen document.getElementById()
und dann den gleichen Ansatz wie oben zu verfolgen. Der Code wird, immer noch mit der Javascript-Magie
%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "'"+thename+"'";
kernel.execute(command);
Dann aus einer Ipython-Zelle,
In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis
Im Gegensatz zur ersten Lösung werden Änderungen am Namen des Notebooks sofort aktualisiert, und das Notebook muss nicht aktualisiert werden.