2016-03-03 4 views
2

Я запускаю Windows 7 с Python 2.7.«Объект« Module »не имеет атрибута ...» Ошибка многопроцессорности

Я пытаюсь запустить базовый многопроцессорный код с модулем multiprocessing для проверки удобства использования. Я видел аналогичные ошибки here и here, но приведенный ниже код не имеет этих проблем.

Когда я запускаю приведенный ниже код (или любой код с помощью модуля multiprocessing) из командной строки Anaconda или в Spyder IDE Python Console, я получаю следующее сообщение об ошибке.

Когда я запускаю код в консоли Spyder IDE iPython, я не получаю сообщение об ошибке, но программа никогда не завершается, и из моего Windows Task Manager я вижу, что на python не используется какой-либо процессор, хотя Spyder показывает, что он все еще работает (красный квадрат над консолью красный).

import multiprocessing 

def funSquare(num): 
    return num ** 2 

if __name__ == '__main__': 
    pool = multiprocessing.Pool() 
    results = pool.map(funSquare, range(10)) 
    print(results) 

Process PoolWorker-1: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-2: 
Process PoolWorker-5: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-4: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-3: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-6: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-8: 
Process PoolWorker-7: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-9: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 
Process PoolWorker-10: 
Traceback (most recent call last): 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 258, in _bootstrap 
    self.run() 
    File "C:\Anaconda\lib\multiprocessing\process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Anaconda\lib\multiprocessing\pool.py", line 102, in worker 
    task = get() 
    File "C:\Anaconda\lib\multiprocessing\queues.py", line 376, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'funSquare' 

Может ли кто-нибудь сказать мне, как разрешить это? Также дайте мне знать, нужны ли дополнительные данные. Благодаря!

ответ

1

Я запускал python 3, а IDE был spyder в anaconda (windows), и поэтому у меня тоже была ошибка. Но после долгого дня поиска у меня появилось некоторое решение, и это помогло мне запустить тот же код, что и мой оконный компьютер. Этот сайт помог мне получить решение:

http://python.6.x6.nabble.com/Multiprocessing-Pool-woes-td5047050.html

Поскольку я использую Python 3, я изменил программу немного как это:

from types import FunctionType 
import marshal 

def _applicable(*args, **kwargs): 
    name = kwargs['__pw_name'] 
    code = marshal.loads(kwargs['__pw_code']) 
    gbls = globals() #gbls = marshal.loads(kwargs['__pw_gbls']) 
    defs = marshal.loads(kwargs['__pw_defs']) 
    clsr = marshal.loads(kwargs['__pw_clsr']) 
    fdct = marshal.loads(kwargs['__pw_fdct']) 
    func = FunctionType(code, gbls, name, defs, clsr) 
    func.fdct = fdct 
    del kwargs['__pw_name'] 
    del kwargs['__pw_code'] 
    del kwargs['__pw_defs'] 
    del kwargs['__pw_clsr'] 
    del kwargs['__pw_fdct'] 
    return func(*args, **kwargs) 

def make_applicable(f, *args, **kwargs): 
    if not isinstance(f, FunctionType): raise ValueError('argument must be a function') 
    kwargs['__pw_name'] = f.__name__ # edited 
    kwargs['__pw_code'] = marshal.dumps(f.__code__) # edited 
    kwargs['__pw_defs'] = marshal.dumps(f.__defaults__) # edited 
    kwargs['__pw_clsr'] = marshal.dumps(f.__closure__) # edited 
    kwargs['__pw_fdct'] = marshal.dumps(f.__dict__) # edited 
    return _applicable, args, kwargs 

def _mappable(x): 
    x,name,code,defs,clsr,fdct = x 
    code = marshal.loads(code) 
    gbls = globals() #gbls = marshal.loads(gbls) 
    defs = marshal.loads(defs) 
    clsr = marshal.loads(clsr) 
    fdct = marshal.loads(fdct) 
    func = FunctionType(code, gbls, name, defs, clsr) 
    func.fdct = fdct 
    return func(x) 

def make_mappable(f, iterable): 
    if not isinstance(f, FunctionType): raise ValueError('argument must be a function') 
    name = f.__name__ # edited 
    code = marshal.dumps(f.__code__) # edited 
    defs = marshal.dumps(f.__defaults__) # edited 
    clsr = marshal.dumps(f.__closure__) # edited 
    fdct = marshal.dumps(f.__dict__) # edited 
    return _mappable, ((i,name,code,defs,clsr,fdct) for i in iterable) 

После этой функции, приведенный выше код проблемы также немного изменился, как это:

from multiprocessing import Pool 
from poolable import make_applicable, make_mappable 

def cube(x): 
    return x**3 

if __name__ == "__main__": 
    pool = Pool(processes=2) 
    results = [pool.apply_async(*make_applicable(cube,x)) for x in range(1,7)] 
    print([result.get(timeout=10) for result in results]) 

И я получил выход как:

[1, 8, 27, 64, 125, 216] 

Я думаю, что этот пост может быть полезен для некоторых пользователей Windows.

Смежные вопросы