在一个函数中导​​入多个python模块,以轻松设置熟悉的环境

时间:2017-09-22 19:49:26

标签: python import namespaces jupyter-notebook jupyter

我使用了很多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工作区。

1 个答案:

答案 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版本移植。