2010-05-06 3 views
53

Je sais que cela a déjà été répondu, mais il semble que l'exécution du script directement "python filename.py" ne fonctionne pas. J'ai Python 2.6.2 sur SuSE Linux.encore une autre confusion avec erreur multitraitement, objet 'module' n'a pas d'attribut 'f'

code:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
p = Pool(1) 
def f(x): 
    return x*x 
p.map(f, [1, 2, 3]) 

Ligne de commande:

> python example.py 
Process PoolWorker-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap 
    self.run() 
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker 
    task = get() 
File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'f' 
+1

double possible de [Utiliser python multiprocessing Piscine dans le terminal et dans moudles de code pour Django ou Flask] (http://stackoverflow.com/questions/18947876/using-python-multiprocessing-pool -dans-le-terminal-et-dans-le-code-moudles-pour-django) –

+0

@jb. Ce poste est beaucoup plus tard que celui-ci, c'était en 2010, celui-là est 2013 – gatoatigrado

+2

L'âge est irréfutable il y a consensus sur méta que la question avec une meilleure réponse devrait être choisie, et un autre a mieux répondre IMO. –

Répondre

98

Restructurez votre code afin que la fonction f() soit définie avant de créer l'instance de Pool. Sinon, le travailleur ne peut pas voir votre fonction.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from multiprocessing import Pool 

def f(x): 
    return x*x 

p = Pool(1) 
p.map(f, [1, 2, 3]) 
+3

génial, merci beaucoup !! Quel usage cryptique! – gatoatigrado

+1

NOTE: Quelques années plus tard, j'ai commencé à écrire une alternative imap [https://github.com/gatoatigrado/vimap], ce qui rend cette erreur plus difficile (et indique clairement quand les threads sont forkés). – gatoatigrado

+1

@Bartosz, Avez-vous une idée pourquoi ce n'est pas un problème dans les ordinateurs portables ipython? – Framester

4

Celui-ci fonctionne:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == "__main__": 
    p = Pool(1) 
    p.map(f, [1, 2, 3]) 

Je ne suis pas 100% sûr pourquoi votre code ne fonctionne pas, mais je suppose que la raison est que les processus enfants lancés par le module multiprocessing tentent d'importer le module principal (pour avoir accès à les méthodes que vous avez définies) et la strophe if __name__ == "__main__" est requise pour ne pas exécuter le code d'initialisation dans lequel vous avez configuré votre pool.

+0

Si l'on doit exécuter un tel code via un interpréteur sous Windows, y a-t-il du travail? C'est la situation à laquelle je suis confronté en faisant une programmation Python-Fu à partir du plugin Gimp Python Console. – jxramos

+0

Celui-ci n'a pas fonctionné pour moi –

1

Une possibilité est que votre fichier python a le même nom qu'un module:

  • test.py
  • test/
    • __init__.py

dans pickle.py, vous avez l'erreur comin g de:

def find_class(self, module, name): 
     # Subclasses may override this 
     __import__(module) 
     mod = sys.modules[module] # <- here mod will reference your test/__init__.py 
     klass = getattr(mod, name) 
     return klass 
Questions connexes