我使用了很多Jupyter笔记本来设计系统。我发现自己也在为我开始的每个笔记本设置环境做同样的事情,所以我想我会为我做一个能完成所有这些工作的功能。它应该将模块列表导入所需的命名空间。例如,假设此函数存在于:my_package.setup_workspace:
def imports():
import numpy as np
然后,我希望能够在新的jupyter笔记本上设置我的工作区:
import my_package
my_package.setup_workspace
np.array(["I wish this could work!"])
但是当我这样做时,python报告它无法找到np,因此imports()函数无法将numpy正确导入新的jupyter工作区。
答案 0 :(得分:1)
在函数中导入时,可以导入函数的local
命名空间中的内容,而不是模块global
。除非您声明变量是全局变量,否则它们需要已经在外部范围内退出。这允许您在函数中重用变量名称而不会污染"外部范围。
你有几种方法可以继续:
第一个自包含方式,请参阅this twitter线程和this解决方案,以定义自己的魔法。然后,您可以在笔记本中执行%imports
以通过一堆导入替换当前单元格。优点是你可以传递选项,但它只适用于IPython。
其次,只需删除该功能,然后在my_package.py
的顶层执行所有设置,然后执行from my_package import *
。 import *
在Python世界中不受欢迎,但如果它只适合你,你应该是安全的。
第三,看看IPython中的%run -i
可以做什么,它是hackish但应该工作,因为它可以在当前命名空间中执行和外部脚本。
有一些其他疯狂的方法,一旦你想深入了解python如何工作,你可以调查:你可以,例如实际上手动提取setup_workspace
的{{1}}对象;修改它并重新执行它以不创建本地范围,但that's可能不是您正在寻找的。虽然有可能,但可能无法跨Python版本移植。