¿Cómo obtengo el nombre actual de IPython Notebook?

Estoy intentando obtener el nombre actual de la Libreta de notas cuando ejecuto el cuaderno de IPython. Sé que puedo verlo en la parte superior del cuaderno. Lo que estoy buscando algo como

currentNotebook = IPython.foo.bar.notebookname() 

Necesito obtener el nombre en una variable.

Como ya se mencionó, probablemente no se supone que puedas hacer esto, pero encontré una manera. Aunque es un truco de fuego, así que no confíes en esto en absoluto:

 import json import os import urllib2 import IPython from IPython.lib import kernel connection_file_path = kernel.get_connection_file() connection_file = os.path.basename(connection_file_path) kernel_id = connection_file.split('-', 1)[1].split('.')[0] # Updated answer with semi-solutions for both IPython 2.x and IPython < 2.x if IPython.version_info[0] < 2: ## Not sure if it's even possible to get the port for the ## notebook app; so just using the default... notebooks = json.load(urllib2.urlopen('http://127.0.0.1:8888/notebooks')) for nb in notebooks: if nb['kernel_id'] == kernel_id: print nb['name'] break else: sessions = json.load(urllib2.urlopen('http://127.0.0.1:8888/api/sessions')) for sess in sessions: if sess['kernel']['id'] == kernel_id: print sess['notebook']['name'] break 

Actualicé mi respuesta para incluir una solución que "funciona" en IPython 2.0 al menos con una prueba simple. Probablemente no esté garantizado para dar la respuesta correcta si hay varios portátiles conectados al mismo kernel, etc.

Tengo lo siguiente que funciona con IPython 2.0. Observé que el nombre del cuaderno se almacena como el valor del atributo 'data-notebook-name' en la etiqueta de la página. Por lo tanto, la idea es primero pedirle a Javascript que recupere el atributo –javascripts se puede invocar desde un codecell gracias a la magia %%javascript . Luego es posible acceder a la variable de Javascript a través de una llamada al núcleo de Python, con un comando que establece una variable de Python. Dado que esta última variable se conoce del kernel, también se puede acceder a ella en otras celdas.

 %%javascript var kernel = IPython.notebook.kernel; var body = document.body, attribs = body.attributes; var command = "theNotebook = " + "'"+attribs['data-notebook-name'].value+"'"; kernel.execute(command); 

Desde una celda de código de Python

 print(theNotebook) 

Fuera []: HowToGetTheNameOfTheNoteBook.ipynb

Un defecto en esta solución es que cuando uno cambia el título (nombre) de un cuaderno, entonces este nombre parece no actualizarse inmediatamente (probablemente haya algún tipo de caché) y es necesario volver a cargar el cuaderno para obtener acceso al nuevo nombre.

[Editar] En la reflexión, una solución más eficiente es buscar el campo de entrada para el nombre del cuaderno en lugar de la etiqueta . Buscando en la fuente, parece que este campo tiene el id “notebook_name”. Entonces es posible capturar este valor mediante un document.getElementById() y luego seguir el mismo enfoque que el anterior. El código se convierte, todavía usando la magia javascript

 %%javascript var kernel = IPython.notebook.kernel; var thename = window.document.getElementById("notebook_name").innerHTML; var command = "theNotebook = " + "'"+thename+"'"; kernel.execute(command); 

Entonces, desde una celda ipython,

 In [11]: print(theNotebook) Out [11]: HowToGetTheNameOfTheNoteBookSolBis 

Al contrario de la primera solución, las modificaciones del nombre del cuaderno se actualizan inmediatamente y no hay necesidad de actualizar el cuaderno.

En Jupyter 3.0 los siguientes trabajos. Aquí muestro la ruta completa en el servidor Jupyter, no solo el nombre del cuaderno:

Para almacenar el NOTEBOOK_FULL_PATH en la parte frontal actual de la notebook:

 %%javascript var nb = IPython.notebook; var kernel = IPython.notebook.kernel; var command = "NOTEBOOK_FULL_PATH = '" + nb.base_url + nb.notebook_path + "'"; kernel.execute(command); 

Para luego mostrarlo:

 print("NOTEBOOK_FULL_PATH:\n", NOTEBOOK_FULL_PATH) 

Ejecutar la primera celda de Javascript no produce salida. Ejecutar la segunda celda de Python produce algo como:

 NOTEBOOK_FULL_PATH: /user/zeph/GetNotebookName.ipynb 

añadiendo a las respuestas anteriores,

para obtener el nombre del cuaderno ejecute lo siguiente en una celda:

 %%javascript IPython.notebook.kernel.execute('nb_name = "' + IPython.notebook.notebook_name + '"') 

esto te da el nombre del archivo en nb_name

luego, para obtener la ruta completa, puede usar lo siguiente en una celda separada:

 import os nb_full_path = os.path.join(os.getcwd(), nb_name) 

Parece que no puedo comentar, así que tengo que publicar esto como una respuesta.

La solución aceptada de @iguananaut y la actualización de @mbdevpl parecen no estar funcionando con las versiones recientes de Notebook. Lo arreglé como se muestra abajo. Lo comprobé en Python v3.6.1 + Notebook v5.0.0 y en Python v3.6.5 y Notebook v5.5.0.

 from notebook import notebookapp import urllib import json import os import ipykernel def notebook_path(): """Returns the absolute path of the Notebook or None if it cannot be determined NOTE: works only when the security is token-based or there is also no password """ connection_file = os.path.basename(ipykernel.get_connection_file()) kernel_id = connection_file.split('-', 1)[1].split('.')[0] for srv in notebookapp.list_running_servers(): try: if srv['token']=='' and not srv['password']: # No token and no password, ahem... req = urllib.request.urlopen(srv['url']+'api/sessions') else: req = urllib.request.urlopen(srv['url']+'api/sessions?token='+srv['token']) sessions = json.load(req) for sess in sessions: if sess['kernel']['id'] == kernel_id: return os.path.join(srv['notebook_dir'],sess['notebook']['path']) except: pass # There may be stale entries in the runtime directory return None 

Como se indica en la cadena de documentos, esto funciona solo cuando no hay autenticación o la autenticación está basada en token.

Tenga en cuenta que, como también informaron otros, el método basado en Javascript no parece funcionar cuando se ejecuta “Ejecutar todas las celdas” (pero funciona cuando se ejecutan celdas “manualmente”), lo cual fue un factor decisivo para mí.