Eu tenho o seguinte que funciona com IPython 2.0. Observei que o nome do notebook fica armazenado como o valor do atributo 'data-notebook-name'
na <body>
tag da página. Portanto, a ideia é primeiro pedir ao Javascript para recuperar o atributo - os javascripts podem ser invocados a partir de um codecell graças à %%javascript
magia. Então é possível acessar a variável Javascript através de uma chamada ao Kernel Python, com um comando que define uma variável Python. Como esta última variável é conhecida no kernel, ela pode ser acessada em outras células também.
%%javascript
var kernel = IPython.notebook.kernel;
var body = document.body,
attribs = body.attributes;
var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'";
kernel.execute(command);
De uma célula de código Python
print(theNotebook)
Out []: HowToGetTheNameOfTheNoteBook.ipynb
Um defeito desta solução é que quando alguém muda o título (nome) de um notebook, então este nome parece não ser atualizado imediatamente (provavelmente existe algum tipo de cache) e é necessário recarregar o notebook para ter acesso ao novo nome.
[Editar] Pensando bem, uma solução mais eficiente é procurar o campo de entrada para o nome do caderno em vez da <body>
tag. Olhando para a fonte, parece que este campo tem id "notebook_name". Então, é possível capturar esse valor por a document.getElementById()
e seguir a mesma abordagem acima. O código se torna, ainda usando a magia do javascript
%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "'"+thename+"'";
kernel.execute(command);
Então, a partir de uma célula ipython,
In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis
Ao contrário da primeira solução, as modificações do nome do notebook são atualizadas imediatamente e não há necessidade de atualizar o notebook.