【问题标题】:How to pass variables from javascript to python in Jupyter?如何在 Jupyter 中将变量从 javascript 传递到 python?
【发布时间】:2016-05-11 20:46:12
【问题描述】:

据我了解,我应该能够在下面的 sn-p 中打印变量 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)。完成这项工作的先决条件是什么?

【问题讨论】:

  • 这不起作用的原因是它会在执行 Javascript 发送的新代码之前完成单元格中的代码。

标签: python ipython jupyter jupyter-notebook


【解决方案1】:

这就是我使您的代码工作的方式:

甚至更简单:

【讨论】:

  • 两者之间有什么实际区别吗?
  • 如何调用外部javascript脚本?
  • 如何在两者之间产生双向通信?
  • 一旦我使用>>按钮“重新启动并重新运行所有单元格”,这对我不起作用。似乎是时间问题。
  • 在 JupyterLab 中不起作用,因为 JavaScript 不知道 IPython。
【解决方案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 需要一些时间才能工作,并且您甚至在设置值之前就打印它。用sleep,3s的等待时间似乎就够了,变量被赋值了。

【讨论】:

  • 这对我在 Jupyter Notebook 上不起作用(在同一单元格上运行此代码)。
【解决方案3】:

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

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

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

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

这就是 Anthony Perot 的例子起作用的原因,它们是分开的细胞。 这也应该有效:

【讨论】:

    【解决方案4】:

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

    from IPython.display import HTML, Javascript
    
    HTML('<script src="./yourfile.js"></script>
    Javascript('yourFunction(%s)' % parameter)
    

    在这种情况下,如果您使用的是 pandas 的数据框,那么最后一行应该如下所示:

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

    链接:

    你可以选择格式函数而不是'%'

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2016-03-29
      • 2019-11-08
      • 2017-11-12
      • 2017-10-23
      • 2011-04-02
      • 2010-11-02
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多