python - notebook - markdown jupyter
¿Cómo obtengo el nombre actual de la notebook IPython? (4)
Estoy tratando de obtener el nombre del libro de notas actual cuando ejecuto el cuaderno de IPython. Sé que puedo verlo en la parte superior del cuaderno. Lo que busco es algo así 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 sí encontré la manera. Es un truco llameante, así que no confíes en esto:
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 dar la respuesta correcta si hay múltiples computadoras portátiles conectadas al mismo kernel, etc.
En Jupyter 3.0, los siguientes trabajos. Aquí estoy mostrando la ruta completa en el servidor Jupyter, no solo el nombre del portátil:
Para almacenar NOTEBOOK_FULL_PATH
en el front end actual del portátil:
%%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)
La ejecución de la primera celda de Javascript no produce salida. La ejecución de la segunda celda Python produce algo como:
NOTEBOOK_FULL_PATH:
/user/zeph/GetNotebookName.ipynb
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 <body>
de la página. Por lo tanto, la idea es primero pedirle a Javascript que recupere el atributo. Los javascripts se pueden invocar desde una celda de código gracias a la magia de %%javascript
. Entonces es posible acceder a la variable Javascript a través de una llamada al núcleo de Python, con un comando que establece una variable de Python. Como esta última variable es conocida del kernel, también se puede acceder a ella en otras células.
%%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 Python
print(theNotebook)
Fuera []: HowToGetTheNameOfTheNoteBook.ipynb
Un defecto en esta solución es que cuando uno cambia el título (nombre) de una computadora portátil, este nombre parece no actualizarse inmediatamente (es probable que haya algún tipo de caché) y es necesario volver a cargar la computadora portátil para tener acceso a la nuevo nombre.
[Editar] Como reflejo, una solución más eficiente es buscar el campo de entrada para el nombre del portátil en lugar de la etiqueta <body>
. Al examinar la fuente, parece que este campo tiene el id "nombre_del_paquete". Entonces es posible capturar este valor con document.getElementById()
y luego seguir el mismo enfoque que el anterior. El código se convierte, sigue usando la magia de JavaScript
%%javascript
var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook = " + "''"+thename+"''";
kernel.execute(command);
Luego, desde una celda ipython,
In [11]: print(theNotebook)
Out [11]: HowToGetTheNameOfTheNoteBookSolBis
A diferencia de la primera solución, las modificaciones del nombre del portátil se actualizan de inmediato y no es necesario actualizar el portátil.
agregando respuestas previas,
para obtener el nombre del portátil ejecuta lo siguiente en una celda:
%%javascript
IPython.notebook.kernel.execute(''nb_name = "'' + IPython.notebook.notebook_name + ''"'')
esto te da el nombre de 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)