22

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

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”参数包含在内。

4

7 回答 7

17

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

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

尽管我不推荐这种方法而不是官方custom.js方法,但有时我确实发现它对快速测试某些东西或动态生成一个小的 JavaScript 片段很有用。

于 2015-07-31T16:31:31.337 回答
9

在 IPython Notebook 中嵌入 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 变量,反之亦然。

于 2017-11-21T13:54:24.363 回答
4

我已经与这个问题作斗争了好几天了,这似乎可行;买家要小心,这是一个最小的工作解决方案,它既不漂亮也不优化 - 一个更好的解决方案将非常受欢迎!

首先,在 中.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。我很想看到一个更简单的解决方案(请开发人员我们$.getScript('/static/custom/util.js');可以custom.js加载一堆全局 JS 函数) - 但这是我目前最好的。除了唱歌和跳舞之外,IPython notebook 团队的巨大进步,这是一个很棒的平台!

于 2014-02-06T22:03:29.533 回答
4

至少现在不是通过安装软件包开箱即用。这样做的方法是使用custom.jsjQuerygetScript将 js 注入到 notebook 中。

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

您应该知道的是,static用户配置文件中的文件merged夹带有网络服务器静态资产,允许您通过询问正确的 url 来访问此文件夹中的任何文件。

几个小时前,这个问题已经在 IPython 每周视频“实验室会议”上被问到,在 youtube 上直播和 disponible(你可能有更长的答案),我已经在这里与问题的作者进行了讨论

于 2013-05-31T09:02:52.690 回答
3

出于某种原因,我遇到了 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")')
于 2018-12-14T11:57:45.017 回答
0

您可以使用IJavascript(用于 Jupyter 笔记本的 Javascript 内核)。

于 2021-08-12T07:36:49.653 回答
0

我有兴趣从 Jupyter 代码 (Python) 单元调用 JavaScript 来处理字符串,并将处理后的字符串输出到(相同的)代码单元输出中;感谢向IPython 笔记本注入/执行 JS 代码,并禁止在页面重新加载时进一步执行为什么 python 不能从 python 函数中调用 Javascript()?现在我有这个例子:

from IPython.display import display, Javascript, Markdown as md, HTML

def js_convert_str_html(instring_str):
    js_convert = """
        <div id="_my_special_div"></div>
        <script>
        var myinputstring = '{0}';
        function do_convert_str_html(instr) {{
            return instr.toUpperCase();
        }}
        document.getElementById("_my_special_div").textContent = do_convert_str_html(myinputstring);
        </script>
    """.format(instring_str)
    return HTML(js_convert)

jsobj = js_convert_str_html("hello world")
display(jsobj)

请注意,JavaScript 处理的字符串本身不会返回给 Python ;相反,JavaScript 本身会创建自己的 div,并将字符串转换的结果添加到其中。

于 2021-09-02T12:07:18.320 回答