我想将iPython Notebook中的一些单元格收集到python脚本中。但是,我无法导入已添加到具有“writefile -a”魔法的脚本的函数。这是一个用于复制问题的4单元笔记本:
单元格1:将函数保存到foo.py
%%writefile foo.py
def some_func():
print 42
单元格2:使用foo.py
中的函数from foo import some_func
some_func()
成功打印42个。
单元格3:将另一个函数附加到foo.py
%%writefile foo.py -a
def other_func():
print 43
单元格4:尝试导入other_func
from foo import other_func
other_func()
ImportError:无法导入名称other_func
答案 0 :(得分:3)
修改后需要reload模块:
import importlib
importlib.reload(foo)
通常,使用import语句的import foo
形式而不是from foo import some_func
可以更好地工作。如果您有一个长模块名称,可以使用import some_long_module as slm
答案 1 :(得分:1)
IPython有一个特定的扩展名" autoreload"在进入在IPython提示符下键入的代码执行之前自动重新加载模块。
它已包含在标准的IPython安装中,因此在您的示例中,您只需要编写:
%load_ext autoreload
%autoreload 2
import foo
然后每次调用foo的特定函数时,它将在实际执行单元代码之前动态重新加载,这样就可以解决问题。