【发布时间】:2012-08-31 13:18:48
【问题描述】:
我一直在阅读和重新阅读 IPython 文档/教程,但我无法弄清楚这段特定代码的问题。似乎函数dimensionless_run对传递给每个引擎的命名空间不可见,但我很困惑,因为该函数是在__main__中定义的,并且作为全局命名空间的一部分清晰可见。
wrapper.py:
import math, os
def dimensionless_run(inputs):
output_file = open(inputs['fn'],'w')
...
return output_stats
def parallel_run(inputs):
import math, os ## Removing this line causes a NameError: global name 'math'
## is not defined.
folder = inputs['folder']
zfill_amt = int(math.floor(math.log10(inputs['num_iters'])))
for i in range(inputs['num_iters']):
run_num_str = str(i).zfill(zfill_amt)
if not os.path.exists(folder + '/'):
os.mkdir(folder)
dimensionless_run(inputs)
return
if __name__ == "__main__":
inputs = [input1,input2,...]
client = Client()
lbview = client.load_balanced_view()
lbview.block = True
for x in sorted(globals().items()):
print x
lbview.map(parallel_run,inputs)
在ipcluster start --n=6 之后执行此代码会生成排序后的全局字典,包括math 和os 模块,以及parallel_run 和dimensionless_run 函数。接下来是一个IPython.parallel.error.CompositeError: an or more exceptions from call to method:parallel_run,由大量[n:apply]: NameError: global name 'dimensionless_run' is not defined组成,其中n从0-5运行。
有两件事我不明白,它们之间有明显的联系。
- 为什么代码在全局命名空间中没有标识
dimensionless_run? - 为什么
import math, os必须在parallel_run的定义里面?
已编辑:这根本不是命名空间错误——我在一个不包含代码的目录中执行ipcluster start --n=6。要修复它,我需要做的就是在我的代码目录中执行 start 命令。我还通过添加以下行来修复它:
inputs = input_pairs
os.system("ipcluster start -n 6") #NEW
client = Client()
...
lbview.map(parallel_run,inputs)
os.system("ipcluster stop") #NEW
在正确的位置启动所需的集群。
【问题讨论】:
标签: python parallel-processing ipython nameerror