2017-09-22 43 views
0

我使用了很多Jupyter笔记本来设计系统。我发现自己做同样的事情来为每个笔记本开始设置我的环境,所以我想我会做一个功能,为我做所有这些。它应该将模块列表导入到所需的名称空间中。例如,假设该功能存在于:my_package.setup_workspace:在一个函数中导​​入多个python模块,以轻松设置熟悉的环境

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

当你在一个函数中进行导入时,你可以在该函数的local名称空间中导入东西,而不是在模块global之一。除非你声明变量是全局的,但是它们需要已经在外部范围内退出。这允许您跨功能重复使用变量名称,而不会“污染”外部范围。

你的前进几个方面:

首先自给的方式看到this Twitter的线程和this的解决方案,来定义自己的魔法。然后,您可以在笔记本中执行%imports以通过一堆导入来替换当前单元格。优点是你可以传递选项,但它只能在IPython中使用。

其次,只需删除该功能,并在my_package.py的顶层执行所有设置,然后执行from my_package import *import *在Python世界中被人们所诟病,但如果它只是为了你,你应该是安全的。

第三,看一下IPython中的%run -i可以做什么,它很冒险,但应该可以工作,因为它可以在当前命名空间中执行和外部脚本。

有一些其他疯狂的方式可以调查一旦你想深入了解python的工作方式:例如,你可以实际手动提取setup_workspace__code__对象;修改它并重新执行它以不创建本地范围,但that's可能不是您要查找的内容。尽管这是可能的,但是可能无法在Python版本中移植。

+0

这很有帮助。我有点惊讶,没有标准的选择,但我想这是因为设计者认为最好总是明确命名空间,而不要让另一个导入的文件污染全局命名空间。我想我会使用import *方法。这样我也可以在my_package.py中运行自定义设置代码,进一步设置我的工作空间(设置numpy和pandas自定义选项)并确保用户在正确的虚拟环境中运行。谢谢! –