notebook ipython ipython-notebook jupyter-notebook jupyter

ipython - notebook - ¿Cómo(puedo) usar un archivo custom.js en el cuaderno Jupyter?



jupyter import python file (4)

¿Cómo hago para que las cosas vuelvan a funcionar? ¿Simplemente no necesito esperar más para que se inicie la aplicación?

No tengo una visión profunda de la forma recomendada de hacer esto, pero con Jupyter / IPython 4.0, esperar en "notebook_loaded.Notebook" en lugar de "app_initialized.NotebookApp" funciona es decir, utilice esta línea:

events.on("notebook_loaded.Notebook", function () {

En el cuaderno de IPython (v3.1, por ejemplo), podría agregar un ~/.ipython/profile_default/static/custom/custom.js para ejecutar algún JavaScript personalizado. Por ejemplo, podría hacer algo como esto:

require([''base/js/namespace'', ''base/js/events''], function(IPython, events) { console.log("A"); events.on(''app_initialized.NotebookApp'', function() { console.log("B"); }); console.log("C"); });

Luego, en la consola JS, vería A , seguido de B , seguido de C

Ahora, a partir de la versión 4.0, lo han dividido en el cuaderno Jupyter. El mismo archivo se carga (a pesar del hecho de que se encuentra en ~/.ipython , en lugar de en ~/.jupyter ), y el código se ejecuta. Sin embargo, ya no veo la línea B Supongo que la aplicación no se está inicializando. Todavía veo que se activa en el código fuente , pero ¿viene más tarde o simplemente no funciona?

¿Cómo hago para que las cosas vuelvan a funcionar? ¿Simplemente no necesito esperar más para que se app_initialized ? ¿Está esto documentado en alguna parte?

Editar

Esta página parece sugerir que la forma de hacerlo hoy en día es crear una extensión personalizada y poner toda la acción en la función load_ipython_extension . ¿Está bien? Si es así, ¿qué hay de mathjax? ¿Y las opciones de CodeMirror?


El evento app_initialized.NotebookApp aún se app_initialized.NotebookApp si observa el código static/notebook/js/main.js

pero tienes que escuchar en este evento usando la función define () de requireJS:

define([ ''base/js/namespace'', ''base/js/events'' ], function(IPython, events) { events.on(''app_initialized.NotebookApp'', function() { // Your Code }); });

Aquí se ejecutará su devolución de llamada.

Si pones en tu custom.js :

require([''base/js/namespace'', ''base/js/events''], function(IPython, events) { events.on(''notebook_loaded.Notebook'', function() { console.log(''require & notebook_loaded.Notebook''); }); events.on(''app_initialized.NotebookApp'', function() { console.log(''require & app_initialized.NotebookApp''); }); }); define([''base/js/namespace'', ''base/js/events''], function(IPython, events) { events.on(''notebook_loaded.Notebook'', function() { console.log(''define & notebook_loaded.Notebook''); }); events.on(''app_initialized.NotebookApp'', function() { console.log(''define & app_initialized.NotebookApp''); }); });

El resultado en la consola será:

define() & app_initialized.NotebookApp define() & notebook_loaded.Notebook require() & notebook_loaded.Notebook

Supongo que con el require() te registras en un evento que ya había sucedido ...

require() está a la espera de que todas las dependencias y submódulos se inicialicen ... lo que podría ser demasiado tarde para el evento app_initialized.NotebookApp .


Esta pregunta surgió en el rastreador de problemas de Github - Problemas con jupyter 4.0 - y enlaces a una actualización reciente que parece simplificar la carga de extensiones: actualización de código :

"Al editar notebook.json manualmente. Por defecto, se encuentra en ~ / .jupyter / nbconfig / notebook.json :"

{ "load_extensions": { "notify": true, "theme_toggle": true } }

Agregar cosas como "code_folding/main": true también parece funcionar.

¿Entiendo que esto reemplazaría el uso de custom.js para cargar las extensiones?


Usar custom.js todavía funciona para mí, pero parece moverse un poco.

Actualmente (versión 4.2.3 ), así como en la documentación de la próxima versión 5.0 , está en ~/.jupyter/custom/custom.js . Consulte la documentación en http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/JavaScript%20Notebook%20Extensions.html#custom.js

Puede mostrar la ruta y el contenido de custom.js ejecutando este fragmento de custom.js en un cuaderno:

from jupyter_core.paths import jupyter_config_dir jupyter_dir = jupyter_config_dir() import os.path custom_js_path = os.path.join(jupyter_dir, ''custom'', ''custom.js'') print("searching for custom.js in ", custom_js_path) # my custom js if os.path.isfile(custom_js_path): with open(custom_js_path) as f: print(f.read()) else: print("You don''t have a custom.js file")