如何正确导入Jupyter Notebook中引擎上的模块以进行并行处理?

痛风

我希望运行一个令人尴尬的并行函数,该函数使用带有Python的Jupyter Notebook创建图(并最终将其保存到文件中)(编辑-我在这里找到了一种更简单的方法来完成此操作)。我正在尝试最简单的版本,但出现导入错误。

我应该在哪里以及为什么要导入相关模块?我想我将它们导入到所有地方只是为了确保但仍然有一个错误!

导入文件中的位置从1-4编号

[1]这行真的有必要吗?为什么?

[2]这行真的有必要吗?为什么?

[3]这行真的有必要吗?为什么?

[4]这行真的有必要吗?为什么?

以下是我的文件:jupyter笔记本文件:

import ipyparallel
clients = ipyparallel.Client()
print(clients.ids)
dview = clients[:]
with dview.sync_imports():
    import module #[1]
    import matplotlib #[2]
import module #[3]
dview.map_sync(module.pll, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

和一个python文件名module.py

import matplotlib #[4]
def pll(x):
    matplotlib.pyplot.plot(x, '.')

当我运行笔记本时,我得到以下输出

[0, 1, 2, 3, 4, 5]
importing module on engine(s)
importing matplotlib on engine(s)
[Engine Exception]
NameErrorTraceback (most recent call last)<string> in <module>()
(...)
NameError: name 'matplotlib' is not defined
明克

简短答案

使用模块功能时,sync_imports是不必要的。这应该足够了:

# notebook:
import ipyparallel as ipp
client = ipp.Client()
dview = client[:]

import module
dview.map_sync(module.pll, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# module.py
from matplotlib import pyplot
def pll(x):
    pyplot.plot(x, '.')

一个警告:您几乎肯定会想要设置matplotlib以在引擎上使用非默认后端。您必须在导入pyplot之前执行此操作使用ipython parallel的两个逻辑选择是,agg如果您只是保存到文件中,或者%matplotlib inline要在笔记本中交互式查看绘图。要使用agg:

import matplotlib
dview.apply_sync(matplotlib.use, 'agg')

或设置内联绘图:

%px %matplotlib inline

长答案

要回答您的项目符号问题,请执行以下操作:

  • [1]否,除非您想module在各处的全局变量中定义
  • [2]否,除非您想matplotlib在各处的全局变量中定义
  • [3]是,这需要传递.pll给地图
  • [4]是的,因为module与的名称空间不同__main__,在此名称空间中所有笔记本代码都在其中运行。

在处理需要导入的内容以及在何处时,需要考虑两个上下文:

交互式定义的功能

交互方式定义函数(即,def foo()笔记本中的)时,将在交互式名称空间中执行名称查找,并且引擎和客户端之间的引擎上的交互式名称空间可能会有所不同例如,您可以通过以下方式查看此内容:

import numpy
%px numpy = 'whywouldyoudothis'

def return_numpy():
    return numpy # resolved locally *on engines*
dview.apply_sync(return_numpy)

其中apply会传回['why ..']字串清单,而不是您的本机numpy汇入清单Python不知道名称是指模块或其他名称。这全都取决于使用什么名称空间来查找名称。这就是为什么您经常会看到交互式定义的函数,看起来像其中之一的原因:

import module
%px import module
def foo():
    return module.x

或这个:

def foo():
    import module
    return module.x

两种方法都可以确保moduleinfoo映射到引擎上的导入模块:一种方法是在任何地方执行交互式名称空间导入,并依赖于全局名称空间查找。该函数中的其他导入,因此不会出错。

sync_imports() 是一种纯Python的方法,可完成以下操作:

import module
%px import module

它在这里和那里都导入模块。如果使用sync_imports,则也不必在本地重复导入,因为已经执行了本地导入。

模块功能

如果函数是在模块中定义的,则将在其模块中找到全局变量,而不是在交互式名称空间中。因此import matplotlib,在笔记本中对matplotlib名称何时module.pll被调用没有定义有任何影响同样,在模块中导入matplotlib不会使其在交互式名称空间中可用。

需要考虑的重要事项:将模块功能发送给引擎时,它仅发送对该功能引用,而不发送功能或模块内容因此,如果from module import pll从客户端在引擎上返回不同的内容,您将获得不同的行为。在ipython并行中使用本地模块并同时主动更改该模块时,这可能会使人绊倒。在笔记本电脑重新加载该模块不会在引擎上重新加载该模块。它将发送相同的module.pll参考。因此,如果您正在积极从事module.py,那么当模块更改时,您将需要在reload(module) 任何地方调用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确将datetime模块导入jupyter笔记本?

如何在Jupyter Notebook中导入Pyperclip?

如何从Jupyter中的PILLOW导入图像?

Jupyter Notebook如何导入不在当前工作目录中的模块?

如何在Jupyter Notebook单元中刷新Python导入?

如何正确共享Jupyter Docker进行托管

如何在Typescript中正确导入模块?

如何从 src 模块正确导入函数

在HDInsight上的Jupyter Notebook中导入自己的模块

如何在Banshee上正确导入媒体?

在 python / jupyter 上导入模块

在conda安装后导入模块时,jupyter Notebook中的ModuleNotFoundError

如何在Jupyter Notebook中导入python .py文件

无法在 Jupyter Notebook 中导入 matplotlib,而它看起来实际上已正确安装在正确的 Python 版本中

Jupyter Notebook不导入任何模块

在Jupyter Notebook中导入模块-路径

将Python模块导入Jupyter Notebook

如何在 Jupyter 笔记本上导入 openCV?

在python中处理子模块上的导入

VSCode:如何将从Jupyter Notebook导入的python文件导出回Jupyter格式?

在Jupyter Notebook上导入librosa命令的问题

无法在Jupyter Notebook上导入熊猫

无法在Jupyter中并行导入IPython

如何修复Jupyter Notebook中的错误,当我尝试导入任何东西时会看到

如何解决 Spyder 和 Jupyter Notebook 中的 SymPy 导入错误?

如何将库和模块正确导入android studio

如何从相邻文件夹中正确导入python模块?

如何在TypeScript中正确导出和导入模块

如何跨角度模块正确导入/导出类?