并行IPython在列表理解中检测闭包

并行IPython在列表理解中检测闭包,python,ipython,pickle,ipython-parallel,Python,Ipython,Pickle,Ipython Parallel,我想用IPython.parallel来并行一些python代码,但问题是,IPython在执行并行函数时检测闭包 My environment get的初始化方式为: from IPython.parallel import Client c = Client() v = c.direct_view() qs = [1,2,3,4] 该功能定义为: @v.parallel(block=True) def pbands(qs): i = 1 # This should normall

我想用
IPython.parallel来并行一些python代码,但问题是,IPython在执行并行函数时检测闭包

My environment get的初始化方式为:

from IPython.parallel import Client
c = Client()
v = c.direct_view()

qs = [1,2,3,4]
该功能定义为:

@v.parallel(block=True)
def pbands(qs):
    i = 1 # This should normally be a loop variable inside the function
    valar = [i for j in range(3)]
    return 0
按如下方式执行此函数:

pbands(qs)
产生错误

ValueError: Sorry, cannot pickle code objects with closures
将列表中的
i
替换为文字数字或
j
,不会产生错误,但这不是合适的解决方案,因为在实际代码中
i
将是一个循环变量


有什么方法可以让列表理解工作吗?

Python 3在列表理解上创建闭包。这段代码在Python2上不会有问题

IPython不处理闭包。这将在IPython 3.0()和2.1()中修复(不同)。如果您告诉IPython使用dill
dill
,更多的内容将可序列化,包括这段特定的代码:

rc[:].use_dill()

DirectView.use_dill
在IPython 2.0中是一个新功能。

我用
dill 0.2b1
尝试了您的解决方案,但这会导致一些不同的错误(
KeyErrors
UnpicklingError:pickle在帧结束之前用完了
)。这是
dill
的旧版本,可能用
dill-0.2
版本再试一次。