我希望运行一个令人尴尬的并行函数,该函数使用带有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
要回答您的项目符号问题,请执行以下操作:
module
在各处的全局变量中定义matplotlib
在各处的全局变量中定义.pll
给地图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
两种方法都可以确保module
infoo
映射到引擎上的导入模块:一种方法是在任何地方执行交互式名称空间导入,并依赖于全局名称空间查找。该函数中的其他导入,因此不会出错。
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] 删除。
我来说两句