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

Я рекомендую попробовать один из них и посмотреть, решит ли это вашу проблему.

Другие вопросы по тегам