Ipython 如何在Jupyter笔记本下使用自定义的.js文件?
在IPython笔记本(例如v3.1)中,我可以添加一个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/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")