Ipython 如何在Jupyter笔记本下使用自定义的.js文件?

Ipython 如何在Jupyter笔记本下使用自定义的.js文件?,ipython,ipython-notebook,jupyter-notebook,jupyter,Ipython,Ipython Notebook,Jupyter Notebook,Jupyter,在IPython笔记本(例如v3.1)中,我可以添加一个~/.IPython/profile\u default/static/custom/custom.js文件来执行一些自定义JavaScript。例如,我可以这样做: require(['base/js/namespace', 'base/js/events'], function(IPython, events) { console.log("A"); events.on('app_initialized.Notebook

在IPython笔记本(例如v3.1)中,我可以添加一个
~/.IPython/profile\u default/static/custom/custom.js
文件来执行一些自定义JavaScript。例如,我可以这样做:

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");
});
然后,在JS控制台中,我会看到
A
,然后是
B
,然后是
C

现在,从4.0版开始,他们已经将其拆分为Jupyter笔记本。加载相同的文件(尽管它位于
~/.ipython
下,而不是
~/.jupyter
下),并执行代码。但是,我不再看到
B
行。我猜应用程序没有初始化。我仍然看到它会在中被触发,但这是以后才会发生,还是只是不起作用

我如何让事情恢复正常?我是否不再需要等待
app\u初始化
?这些都有记录吗

编辑 似乎建议现在的做法是创建一个自定义扩展,并将所有操作放在
load\u ipython\u扩展
函数中。是这样吗?如果是,那么mathjax呢?还有代码镜像选项

我如何让事情恢复正常?难道我不需要等待吗 app_是否已初始化

我对推荐的方法没有深入的了解,但是使用Jupyter/IPython 4.0,等待“notebook\u loaded.notebook”而不是“app\u initialized.NotebookApp”是可行的。i、 e.使用这一行:

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

如果查看笔记本代码,
app\u initialized.NotebookApp
事件仍会触发

但您必须使用requireJS中的define()函数来监听此事件:

define([
  'base/js/namespace',
  'base/js/events'
], function(IPython, events) {
   events.on('app_initialized.NotebookApp', function() {
     // Your Code
   });
});
这里将执行您的回调

如果您输入您的
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');
     });
 });
控制台中的结果将是:

define() & app_initialized.NotebookApp
define() & notebook_loaded.Notebook
require() & notebook_loaded.Notebook
我猜使用
require()
可以注册到已经发生的事件


require()
正在等待初始化所有依赖项和子模块。。。这对于
app\u initialized.NotebookApp
事件来说可能太晚了。

这个问题出现在Github问题跟踪器上,并链接到一个最近的更新,该更新似乎简化了扩展的加载:

“手动编辑notebook.json。默认情况下,它位于~/.jupyter/nbconfig/notebook.json:”

添加诸如
“code\u folding/main”:true
之类的内容似乎也能奏效


因此,我的理解是,这将取代使用
custom.js
加载扩展?

使用
custom.js
仍然适用于我,但它似乎有一定的变化

目前(版本
4.2.3
)以及即将发布的
5.0
版本的文档中,它位于
~/.jupyter/custom/custom.js
。请参阅位于的文档

通过在笔记本中执行此代码段,可以显示
custom.js
的路径和内容:

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")

>这些都有记录吗?--我不知道答案,但也许我们可以让@minrk在这里发表评论。你还需要为jupyter 5.0+这样做吗?
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")