据我了解,我应该可以在下面的代码段中打印变量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)。使这项工作的先决条件是什么?
答案 0 :(得分:9)
答案 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的示例起作用的原因,它们是分开的单元。 这也应该起作用:
答案 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'))
链接:
您可以选择格式功能而不是'%'