如何在Jupyter中将变量从javascript传递给python?

时间:2016-05-11 20:46:12

标签: python ipython jupyter jupyter-notebook

据我了解,我应该可以在下面的代码段中打印变量foo

from IPython.display import HTML
HTML('''
    <script type="text/javascript">
        IPython.notebook.kernel.execute("foo=97")
    </script>
     ''')
print(foo)

相反,我看到了以下错误消息:

NameErrorTraceback (most recent call last)
<ipython-input-2-91b73ee49ec6> in <module>()
      5     </script>
      6      ''')
----> 7 print(foo)

NameError: name 'foo' is not defined

我试图使用this answer但努力使其发挥作用。

FWIW,这是在Fedora 23上运行的最新Jupyter代码(根据pip)。使这项工作的先决条件是什么?

4 个答案:

答案 0 :(得分:9)

这就是我使代码工作的方式: enter image description here

甚至更简单:

enter image description here

答案 1 :(得分:2)

from IPython.display import HTML
HTML('''
<script type="text/javascript">
    IPython.notebook.kernel.execute("foo=11")
</script>
 ''')
from time import sleep
sleep(3)
print(foo)

这样做的原因是HTML需要一些时间才能工作,甚至在设置值之前就打印它。在睡眠状态下,3秒的等待时间似乎已足够,变量将被分配。

答案 2 :(得分:1)

这里的问题是HTML对象不是单元格中的最后一个对象。因此,它以相同的方式被忽略,除非显示的是该单元格中的最后一个值,否则不会显示任何其他没有打印的值。 如果您使用下一个代码执行单元格,则不会看到任何警报窗口。

HTML('''
    <script type="text/javascript">
        alert("hello")
    </script>
''')
print("hello")

确保单元格中的最后一个对象是HTML对象,您将看到警报窗口。

HTML('''
    <script type="text/javascript">
        alert("hello")
    </script>
''')

这就是Anthony Perot的示例起作用的原因,它们是分开的单元。 这也应该起作用:

HTML and print in separated cells

答案 3 :(得分:1)

如果您的js代码中有一个带有一些参数的函数,并且您想从Jupyter Notebook调用它,则可以执行以下操作:

from IPython.display import HTML, Javascript

HTML('<script src="./yourfile.js"></script>
Javascript('yourFunction(%s)' % parameter)

在这种情况下,如果您使用的是熊猫的数据框,则最后一行应如下所示:

Javascript('yourFunction(%s)' % parameter.to_json(orient='records'))

链接:

您可以选择格式功能而不是'%'