【发布时间】:2015-06-17 21:41:35
【问题描述】:
函数(由 IPython Notebook 单元调用)是否可以检索 JavaScript 变量的内容(例如 IPython.notebook.notebook_path,其中包含当前笔记本的路径)?
以下内容在直接写入单元格时效果很好(例如,基于this question 及其 cmets):
from IPython.display import display,Javascript
Javascript('IPython.notebook.kernel.execute("mypath = " + "\'"+IPython.notebook.notebook_path+"\'");')
但是如果我尝试把它放在一个函数中,那它就会崩溃:
# this doesn't work
from IPython.display import display,Javascript
def getname():
my_js = """
IPython.notebook.kernel.execute("mypath = " + "\'"+IPython.notebook.notebook_path+"\'");
"""
Javascript(my_js)
return mypath
(是的,我已经尝试在 my_js 脚本和函数中创建 global 变量 mypath 。另请注意:不要被变量中可能的剩余值所迷惑来自之前的命令;为确保在调用函数之前使用mypath = None; del mypath 重置变量,或重新启动内核。)
另一种表述问题的方法是:“IPython.notebook.kernel.execute() 设置的变量的范围(时间和地点)是什么?”?
我认为这不是一个无害的问题,并且可能与 IPython 用于控制其内核及其变量的机制有关,而我不太了解。以下实验说明了该机制的某些方面。以下在两个单独的单元格中完成时有效,但如果两个单元格合并则不起作用:
单元格 [1]:
my_out = None
del my_out
my_js = """
IPython.notebook.kernel.execute("my_out = 'hello world'");
"""
Javascript(my_js)
单元格 [2]:
print(my_out)
这有效并产生预期的hello world。但是如果你合并这两个单元格,它就不起作用了(NameError: name 'my_out' is not defined)。
【问题讨论】:
-
我前段时间满足了您的需求,但没有找到解决方案。我在 GH 上发布了this issue,但我仍然担心这不是那么微不足道。
标签: javascript python ipython-notebook