如何在 Jupyter 中将变量从 javascript 传递到 python?
How to pass variables from javascript to python in Jupyter?
据我了解,我应该能够在下面的代码片段中打印变量 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
我正在尝试使用 但很难让它发挥作用。
FWIW,这是 Fedora 23 上的最新 Jupyter 代码(根据 pip)运行。实现此功能的先决条件是什么?
这就是我让你的代码工作的方式:
或更简单:
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的等待时间似乎就够了,变量就赋值了。
这里的问题是 HTML 对象不是单元格中的最后一个对象。因此它会以相同的方式被忽略,除非它是单元格中的最后一个值,否则不会显示任何其他没有打印的值。
如果您使用下一个代码执行单元格,您将不会看到任何警报 window.
HTML('''
<script type="text/javascript">
alert("hello")
</script>
''')
print("hello")
确保单元格中的最后一个对象是 HTML 对象,您将看到警报 window。
HTML('''
<script type="text/javascript">
alert("hello")
</script>
''')
这就是 Anthony Perot 的例子起作用的原因,它们是分开的单元格。
这也应该有效:
如果您的 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'))
链接:
- https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
- https://pyformat.info/
您可以选择格式函数而不是“%”
据我了解,我应该能够在下面的代码片段中打印变量 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
我正在尝试使用
FWIW,这是 Fedora 23 上的最新 Jupyter 代码(根据 pip)运行。实现此功能的先决条件是什么?
这就是我让你的代码工作的方式:
或更简单:
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的等待时间似乎就够了,变量就赋值了。
这里的问题是 HTML 对象不是单元格中的最后一个对象。因此它会以相同的方式被忽略,除非它是单元格中的最后一个值,否则不会显示任何其他没有打印的值。 如果您使用下一个代码执行单元格,您将不会看到任何警报 window.
HTML('''
<script type="text/javascript">
alert("hello")
</script>
''')
print("hello")
确保单元格中的最后一个对象是 HTML 对象,您将看到警报 window。
HTML('''
<script type="text/javascript">
alert("hello")
</script>
''')
这就是 Anthony Perot 的例子起作用的原因,它们是分开的单元格。 这也应该有效:
如果您的 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'))
链接:
- https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
- https://pyformat.info/
您可以选择格式函数而不是“%”