由于从 Windows 到 Linux 的转换而导致的 dask mro 错误
dask mro Error due to transition from Windows to Linux
我使用 dask
包 delayed
和 compute
方法构建了 Python 2.7 代码。
这是我的代码的一个小例子:
from dask import delayed, compute
import time
class simulation():
# defines simulation parameters
def __init__(self,x):
self.x = x
jobs = range(50) # sample jobs
def simulate(sim):
# sample simulation function
time.sleep(0.01*sim.x)
return sim.x**2
def save_results(results):
# sample dump results function
print results
return []
results = []
for i,j in enumerate(jobs) :
sim = simulation(j)
res = delayed(simulate)(sim) # running simulation given input params as job
results.append(res)
if i%10==0 or i==len(jobs)-1: # evaluation every 50 steps
results = compute(results)[0] # dask execution
results = save_results(results) # storing results to DB and returning empty list
出于某种原因,此代码在 windows 上的 anaconda 设置上运行完美,但在 Linux.
上运行失败
我得到的错误是:
--> 134 res = delayed(simulate)(simulation)
135
136
...
/home/user/.conda/envs/neuro/lib/python2.7/abc.pyc in __subclasscheck__(cls, subclass)
159 return False
160 # Check the subclass hook
--> 161 ok = cls.__subclasshook__(subclass)
162 if ok is not NotImplemented:
163 assert isinstance(ok, bool)
/home/user/.conda/envs/neuro/lib/python2.7/site-packages/backports_abc.pyc
in __subclasshook__(cls, C)
64 def __subclasshook__(cls, C):
65 if cls is Generator:
---> 66 mro = C.__mro__
67 for method in required_methods:
68 for base in mro:
AttributeError: class simulation has no attribute '__mro__'
将软件包 (dask
) 更新到最新版本没有帮助。
关于如何修复它有什么建议吗?
谢谢
你的例子实际上对我来说在 Linux 上工作得很好,在 Python 2.7 和 3.6 上都是如此。
但是正如您在评论中指出的那样,我怀疑您的问题出在这一行:
class simulation():
这很奇怪,通常您会在 Python 2.7
中看到以下内容之一
class simulation(object): # new style class
class simulation: # old style class
我建议您尝试其中一种,看看是否能解决您的问题。
显然,由于 dask
试图并行执行命令,因此需要在任务之间建立依赖路径。
mro
(method-resolution-order in python)是python的object
class的内置属性,定义了初始化的顺序多重继承场景中的对象。
dask
在依赖路径中找到 simulation
对象,然后检查它的 mro
以确定正确的初始化顺序。
出于某种原因,在我的 windows 版本上,__mro__
属性不是必需的,但它在 linux.
上
使用 object
的直接继承将创建此属性,并解决问题:
class simulation(object):
# defines simulation parameters
def __init__(self,x):
self.x = x
我使用 dask
包 delayed
和 compute
方法构建了 Python 2.7 代码。
这是我的代码的一个小例子:
from dask import delayed, compute
import time
class simulation():
# defines simulation parameters
def __init__(self,x):
self.x = x
jobs = range(50) # sample jobs
def simulate(sim):
# sample simulation function
time.sleep(0.01*sim.x)
return sim.x**2
def save_results(results):
# sample dump results function
print results
return []
results = []
for i,j in enumerate(jobs) :
sim = simulation(j)
res = delayed(simulate)(sim) # running simulation given input params as job
results.append(res)
if i%10==0 or i==len(jobs)-1: # evaluation every 50 steps
results = compute(results)[0] # dask execution
results = save_results(results) # storing results to DB and returning empty list
出于某种原因,此代码在 windows 上的 anaconda 设置上运行完美,但在 Linux.
上运行失败我得到的错误是:
--> 134 res = delayed(simulate)(simulation) 135 136
...
/home/user/.conda/envs/neuro/lib/python2.7/abc.pyc in __subclasscheck__(cls, subclass) 159 return False 160 # Check the subclass hook --> 161 ok = cls.__subclasshook__(subclass) 162 if ok is not NotImplemented: 163 assert isinstance(ok, bool) /home/user/.conda/envs/neuro/lib/python2.7/site-packages/backports_abc.pyc in __subclasshook__(cls, C) 64 def __subclasshook__(cls, C): 65 if cls is Generator: ---> 66 mro = C.__mro__ 67 for method in required_methods: 68 for base in mro: AttributeError: class simulation has no attribute '__mro__'
将软件包 (dask
) 更新到最新版本没有帮助。
关于如何修复它有什么建议吗?
谢谢
你的例子实际上对我来说在 Linux 上工作得很好,在 Python 2.7 和 3.6 上都是如此。
但是正如您在评论中指出的那样,我怀疑您的问题出在这一行:
class simulation():
这很奇怪,通常您会在 Python 2.7
中看到以下内容之一class simulation(object): # new style class
class simulation: # old style class
我建议您尝试其中一种,看看是否能解决您的问题。
显然,由于 dask
试图并行执行命令,因此需要在任务之间建立依赖路径。
mro
(method-resolution-order in python)是python的object
class的内置属性,定义了初始化的顺序多重继承场景中的对象。
dask
在依赖路径中找到 simulation
对象,然后检查它的 mro
以确定正确的初始化顺序。
出于某种原因,在我的 windows 版本上,__mro__
属性不是必需的,但它在 linux.
使用 object
的直接继承将创建此属性,并解决问题:
class simulation(object):
# defines simulation parameters
def __init__(self,x):
self.x = x