2010-05-06 30 views
53

我知道這已被回答之前,但似乎直接執行腳本「python filename.py」不起作用。我在SuSE Linux上安裝了Python 2.6.2。又一個多處理錯誤的混淆,'模塊'對象沒有屬性'f'

代碼:

#!/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]) 

命令行:

> 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

[使用Python在終端和在代碼moudles適用於Django或燒瓶多處理池]的可能重複(http://stackoverflow.com/questions/18947876/using-python-multiprocessing-pool解釋-in-the-terminal-and-in-code-moudles-for-django) – 2014-08-10 13:00:48

+0

@jb。那篇文章比這篇文章晚得多,這是2010年,那篇文章是2013年 – gatoatigrado 2014-08-18 23:26:15

+2

年齡不相關,meta有共識,應該選擇有更好答案的問題,另外一個有IMO更好的答案。 – 2014-08-19 07:52:44

回答

98

重構您的代碼,以便在創建池實例之前定義f()函數。否則,工作人員看不到你的功能。

#!/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

真棒,非常感謝你!什麼神祕的用法! – gatoatigrado 2010-05-07 00:21:13

+1

注意:幾年後,我開始編寫一個imap替代方案[https://github.com/gatoatigrado/vimap],這使得這個錯誤更加困難(並且在線程分叉時明確表示)。 – gatoatigrado 2013-06-13 22:29:03

+1

@Bartosz,你有什麼想法,爲什麼這不是在ipython筆記本電腦的問題? – Framester 2014-10-07 09:33:26

4

這一個工程:

#!/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]) 

我不是100%肯定,爲什麼你的代碼不能正常工作,但我猜測原因是由multiprocessing模塊啓動的子進程嘗試導入主模塊(要訪問您定義的方法)和if __name__ == "__main__"節不需要在您設置池的位置執行初始化代碼。

+0

如果必須通過Windows上的解釋器運行此類代碼,是否有解決方法?這就是我在Gimp Python控制檯插件中執行Python-Fu編程時遇到的情況。 – jxramos 2015-03-12 02:40:43

+0

這一個沒有爲我工作 – 2017-11-04 11:07:43

1

一種可能性是,你的Python文件具有相同的名稱作爲模塊:

  • test.py
  • 測試/
    • __init__.py

在pickle.py中,你有錯誤comin g得自:

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 
相關問題