在函数中获取ipython笔记本文件名

在函数中获取ipython笔记本文件名,ipython,jupyter-notebook,Ipython,Jupyter Notebook,此代码在Ipython/Juypter单元格中运行良好,可以获取笔记本文件名: js = """var kernel = IPython.notebook.kernel; var thename = window.document.getElementById("notebook_name").innerHTML; var command = "theNotebook2 = " + "'"+thename+"'"; kernel.execute(command);""" display(Java

此代码在Ipython/Juypter单元格中运行良好,可以获取笔记本文件名:

js = """var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook2 = " + "'"+thename+"'";
kernel.execute(command);"""
display(Javascript(js))
theNotebook2 + '.ipynb'

'techela.ipynb'
如果我在单元格中定义函数并调用它:

def get_filename():
    """Get the notebook filename."""
    js = """var kernel = IPython.notebook.kernel;
var thename = window.document.getElementById("notebook_name").innerHTML;
var command = "theNotebook2 = " + "'"+thename+"'";
kernel.execute(command);"""
    display(Javascript(js))
    return theNotebook2 + '.ipynb'

get_filename()

'techela.ipynb'
它似乎也工作得很好,给我的文件名

但是,如果我将该函数放在一个模块中,并导入它,那么它将停止工作

from techela import get_filename
get_filename()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-17-42ee37d0d253> in <module>()
      1 from techela import get_filename
----> 2 get_filename()

/Users/jkitchin/techela/ipynb/techela.py in get_filename()
     11 kernel.execute(command);"""
     12     display(Javascript(js))
---> 13     return theNotebook2 + '.ipynb'
     14 
     15 

NameError: name 'theNotebook2' is not defined
从techela导入获取\u文件名
获取文件名()
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
1从techela导入获取\u文件名
---->2获取文件名()
/get_filename()中的Users/jkitchin/techela/ipynb/techela.py
11内核。执行(命令);"""
12显示(Javascript(js))
--->13返回笔记本2+“.ipynb”
14
15
名称错误:未定义名称“theNotebook2”

知道为什么会失败吗?

我认为它从来没有完全工作过:我猜当代码在单元格中时,您会多次运行代码。显示Javascript不会同步执行它,因此您无法编写检索文件名并将其返回的函数。直到在它运行完单元之后。