dask mro Ошибка из-за перехода с Windows на Linux
Я построил код Python 2.7, используя dask
пакет delayed
а также compute
методы.
Вот небольшой пример моего кода:
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
по какой-то причине этот код отлично работает при установке anaconda в windows, но не работает в 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
) до последней версии не помогло.
Любое предложение о том, как это исправить?
Спасибо
2 ответа
Видимо, так как dask
пытаясь распараллелить выполнение команд, нужно построить путь зависимости между задачами.
mro
( метод-разрешение-порядок в Python) является встроенным атрибутом Python object
Класс, который определяет порядок инициализации объектов в сценариях множественного наследования.
dask
Найти simulation
объект в пути зависимости, и, следовательно, проверяет его mro
выяснить правильный порядок инициализации.
По какой-то причине в моей версии для Windows, __mro__
Атрибут не требуется, но он на Linux.
Используя прямое наследование от object
создаст этот атрибут и решит проблему:
class simulation(object):
# defines simulation parameters
def __init__(self,x):
self.x = x
Ваш пример на самом деле отлично работает для меня на Linux, как на Python 2.7, так и на 3.6.
Однако, как вы заметили в своем комментарии, я подозреваю, что ваша проблема связана с этой строкой:
class simulation():
Это странно, обычно вы видите одно из следующего в Python 2.7
class simulation(object): # new style class
class simulation: # old style class
Я рекомендую попробовать один из них и посмотреть, решит ли это вашу проблему.