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

Posted

技术标签:

【中文标题】IPython:将 Javascript 脚本添加到 IPython 笔记本【英文标题】:IPython: Adding Javascript scripts to IPython notebook 【发布时间】:2013-05-27 00:22:01 【问题描述】:

作为项目的一部分,我需要在 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”和其他此类外部脚本,这样我每次尝试执行一些需要那个图书馆。

【问题讨论】:

【参考方案1】:

我有兴趣从 Jupyter 代码 (Python) 单元调用 JavaScript 来处理字符串,并将处理后的字符串输出到(相同的)代码单元输出中;感谢Inject/execute JS code to IPython notebook and forbid its further execution on page reload 和Why cannot python call Javascript() from within a python function? 现在我有了这个例子:

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,并将字符串转换的结果添加到其中。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案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")')

【讨论】:

【参考方案4】:

在 IPython Notebook 中嵌入 D3

https://blog.thedataincubator.com/2015/08/embedding-d3-in-an-ipython-notebook/

总结一下代码。

导入脚本:

%%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 双向通信

http://jakevdp.github.io/blog/2013/06/01/ipython-notebook-javascript-python-communication/

一篇更详尽的文章解释了如何在 JavaScript 中访问 Python 变量,反之亦然。

【讨论】:

不幸的是,上述双向解决方案不再像文章中介绍的那样工作。【参考方案5】:

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

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

虽然我不推荐使用官方的custom.js 方法,但有时我确实发现它对快速测试某些东西或动态生成一个小的 JavaScript sn-p 很有用。

【讨论】:

我们可以在这里更改js 字符串以加载外部.js 文件吗? 也可以改成js = """ """ HTML(js ),这样就可以加载外部的js文件了。【参考方案6】:

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

首先,在.ipython/&lt;profile&gt;/static/custom/myScript.js 中,我们做了一些 require.js 魔术:

define(function()

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

    return 
        foo : foo
    
);

复制此模式以获得尽可能多的功能。然后,在.ipython/&lt;profile&gt;/static/custom/custom.js 中,将它们拖到持久化的东西中:

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

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

);

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

%%javascript

foo();

应该做它看起来应该做的事情,而不需要用户显式地导入你的 JS。我很想看到一个更简单的解决方案(请开发人员在custom.js 中有$.getScript('/static/custom/util.js'); 来加载一堆全局JS 函数) - 但这是我目前最好的解决方案。除了唱歌和跳舞之外,IPython 笔记本团队的巨大进步,这是一个很棒的平台!

【讨论】:

【参考方案7】:

至少现在不是通过安装软件包开箱即用。 方法是使用custom.js 和jQuery getScript 将js 注入到notebook 中。

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

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

几个小时前,这个问题已经在 IPython 每周视频“lab meeting”上被问到,在 youtube 上直播和 disponible(你可能有更长的答案),我已经开始与问题的作者讨论 @987654322 @

【讨论】:

我需要在哪里存储我的脚本“Gl.js”以使用 getScript()。 'Javascript('''$.getScript("Gl.js");''')' 它给出了 404 错误 确切路径和指令取决于您运行的 IPython 版本。那就是 $.getScript("static/Gl.js") 和~/.ipython/profile_default/static/[custom]/GI.js。我建议搜索IPython custom.js,在 ml/hipchat 上询问/搜索,因为我担心 *** 的局限性太大,无法为您提供所有必要的解释。 问题是这里的解释会太长,并且可能会改变,难以嵌入代码......等等。我们可以在 IPython ML 或 gihtub bugtracker 上讨论这个问题,如果它托管在任何带有问题跟踪器的地方,也可以在你的 repo 上讨论。 好吧,我和我的导师谈过同样的问题,他或我自己都会在 IPython ML 上发帖。少量的研究结果表明这是 IPython 中的热门话题之一开发 @Matt 改变了吗?

以上是关于IPython:将 Javascript 脚本添加到 IPython 笔记本的主要内容,如果未能解决你的问题,请参考以下文章

python 用于将文本图像转换为tif图像的IPython脚本。

sh 将内核添加到ipython

如何将 python3 内核添加到 jupyter (IPython)

sh 将ipython / jupyter内核添加到python环境中

ipython の 魔术命令

如何清除ipython中的变量?