IPython:将Javascript脚本添加到IPython笔记本中

时间:2013-05-31 08:21:33

标签: javascript html ipython ipython-notebook

作为项目的一部分,我需要在IPython模块中嵌入一些javascripts。 这就是我想要做的事情:

from IPython.display import display,Javascript
Javascript('echo("sdfds");',lib='/home/student/Gl.js')

我的Gl.js看起来像这样

function echo(a){
alert(a);
}

是否有某种方法可以将“Gl.js”和其他此类外部脚本嵌入到笔记本中,这样每次我尝试执行一些需要的Javascript代码时,我都不必将它们包含为“lib”参数那个图书馆。

5 个答案:

答案 0 :(得分:9)

作为一个非常短期的解决方案,您可以使用IPython display()HTML()函数将一些JavaScript注入页面。

from IPython.display import display, HTML
js = "<script>alert('Hello World!');</script>"
display(HTML(js))

虽然我不建议使用<{1}}方法,但有时我觉得快速测试某些内容或动态生成一个小的JavaScript代码段很有用。

答案 1 :(得分:5)

在IPython笔记本中嵌入D3

总结代码。

导入脚本:

%%javascript
require.config({
  paths: {
      d3: '//cdnjs.cloudflare.com/ajax/libs/d3/3.4.8/d3.min'
  }
});

添加如下元素:

%%javascript
element.append("<div id='chart1'></div>");

或者这个:

from IPython.display import Javascript
#runs arbitrary javascript, client-side
Javascript("""
           window.vizObj={};
           """.format(df.to_json()))

IPython Notebook:Javascript / Python双向通信

更详尽的帖子解释了如何在JavaScript中访问Python变量,反之亦然。

答案 2 :(得分:3)

安装包装时没有开箱即用,至少目前是这样。 这样做的方法是使用custom.js和jQuery getScript将js注入笔记本中。

我明确地对如何做到这一点保持模糊,因为它是一个不时变化的开发功能。

您应该知道的是,用户个人资料中的static文件夹为merged,其中包含网络服务器静态资源,您可以通过询问正确的网址来访问此文件夹中的任何文件。

此前几个小时前,我们已经在IPython每周视频“lab meeting”上播放了这个问题,并在youtube上播放了现场直播(您可能会有更长的答案),我已经与该问题的作者展开了讨论here

答案 3 :(得分:3)

我已经和这个问题争了好几天了,这里的东西看起来很有效;买家要小心,这是一个最小的工作解决方案,它既不漂亮也不是最佳 - 一个更好的解决方案将非常受欢迎!

首先,在.ipython/<profile>/static/custom/myScript.js中,我们做了一些require.js魔术:

define(function(){

    var foo = function(){
            console.log('bar');
        }

    return {
        foo : foo
    }
});

复制此模式以获得任意数量的功能。然后,在.ipython/<profile>/static/custom/custom.js中,将它们拖到持久性的东西中:

$([IPython.events]).on('notebook_loaded.Notebook', function(){

    require(['custom/myScript'], function(custom){
        window.foo = custom.foo;
    } );

});

是的,我是一个可怕的人,他把东西扔到窗口对象上,命名空间就像你认为合适。但现在在笔记本中,像

这样的细胞
%%javascript

foo();

应该完全按照它应该的样子,而不必用户显式导入你的JS。我希望看到一个更简单的解决方案(plz开发人员可以在$.getScript('/static/custom/util.js');中使用custom.js来加载一堆全局JS函数) - 但这是我现在所拥有的最好的。抛开这个歌舞,巨大的升级到IPython笔记本团队,这是一个很棒的平台!

答案 4 :(得分:0)

由于某种原因,我遇到了IPython.display.Javascript问题。这是我的替代方法,可以处理导入外部.js文件和运行自定义代码的问题:

from IPython.display import display, HTML

def javascript(*st,file=None):
    if len(st) == 1 and file is None:
        s = st[0]
    elif len(st) == 0 and file is not None:
        s = open(file).read()
    else:
        raise ValueError('Pass either a string or file=.')
    display(HTML("<script type='text/javascript'>" + s + "</script>"))

用法如下:

javascript('alert("hi")')
javascript(file='Gl.js')
javascript('echo("sdfds")')