【问题标题】:dask mro Error due to transition from Windows to Linux由于从 Windows 转换到 Linux 导致的 dask mro 错误
【发布时间】:2017-07-09 08:54:50
【问题描述】:

我已经使用daskdelayedcompute 方法构建了一个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) 更新到最新版本没有帮助。

关于如何修复它的任何建议?

谢谢

【问题讨论】:

  • 您能否提供完整的mcve 以便其他人可以复制粘贴以重现错误?
  • 我的 python 代码是一个最小的可重现示例。原来的长了20倍。至于错误 - 显然在 linux 上有 __mro__ 检查,这与我的课程不兼容(但仅在 dask 上)。用class simulation(object) 定义类将解决它(我自己还不能发布答案)
  • 当我复制您的代码时,它找不到simulate 函数或jobs 变量
  • 你是对的 :) - 我已经编辑,现在示例是一个完整的工作代码。

标签: python linux dask method-resolution-order


【解决方案1】:

您的示例实际上对我在 Linux 上运行良好,包括 Python 2.7 和 3.6。

但是,正如您在评论中指出的那样,我怀疑您的问题与这一行有关:

class simulation():

这很奇怪,通常您会在 Python 2.7 中看到以下内容之一

class simulation(object):  # new style class
class simulation:  # old style class

我建议尝试其中一种,看看是否能解决您的问题。

【讨论】:

    【解决方案2】:

    显然,由于dask试图并行执行命令,它需要在任务之间建立依赖路径。

    mro(method-resolution-order in python)是python的object类的内置属性,定义了多继承场景下对象的初始化顺序。

    dask 在依赖路径中找到simulation 对象,因此检查它的mro 以找出正确的初始化顺序。

    由于某种原因,在我的 windows 版本上,__mro__ 属性不是必需的,但它在 linux 上。

    使用从object 的直接继承将创建此属性,并解决问题:

    class simulation(object):
       # defines simulation parameters
       def __init__(self,x):
            self.x = x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多