2011-09-16 33 views
61

मैंने कुछ सीएसवी-रीडिंग कोड को फिर से लिखने की कोशिश की ताकि पाइथन 3.2.2 में एकाधिक कोरों पर इसे चलाने में सक्षम हो सके। मैंने मल्टीप्रोसेसिंग के पूल ऑब्जेक्ट का उपयोग करने की कोशिश की, जिसे मैंने काम करने वाले उदाहरणों से अनुकूलित किया (और मेरे प्रोजेक्ट के किसी अन्य हिस्से के लिए पहले से ही मेरे लिए काम किया)। मैं एक त्रुटि संदेश में भाग गया जो मुझे समझने और समस्या निवारण के लिए मुश्किल मिला। इसका निवारण करने का एक अच्छा तरीका क्या है? धन्यवाद!पायथन में मल्टीप्रोसेसिंग में "एट्रिब्यूट एरर: __exit__" की समस्या निवारण कैसे करें?

त्रुटि:

Traceback (most recent call last): 
    File "parser5_nodots_parallel.py", line 256, in <module> 
    MG,ppl = csv2graph(r) 
    File "parser5_nodots_parallel.py", line 245, in csv2graph 
    node_chunks) 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get 
    raise self._value 
AttributeError: __exit__ 

प्रासंगिक कोड:

import csv 
import time 
import datetime 
import re 
from operator import itemgetter 
from multiprocessing import Pool 
import itertools 

def chunks(l,n): 
    """Divide a list of nodes `l` in `n` chunks""" 
    l_c = iter(l) 
    while 1: 
     x = tuple(itertools.islice(l_c,n)) 
     if not x: 
      return 
     yield x 

def csv2nodes(r): 
    strptime = time.strptime 
    mktime = time.mktime 
    l = [] 
    ppl = set() 
    pattern = re.compile(r"""[A-Za-z0-9"/]+?(?=[,\n])""") 
    for row in r: 
     with pattern.findall(row) as f: 
      cell = int(f[3]) 
      id = int(f[2]) 
      st = mktime(strptime(f[0],'%d/%m/%Y')) 
      ed = mktime(strptime(f[1],'%d/%m/%Y')) 
     # collect list 
     l.append([(id,cell,{1:st,2: ed})]) 
     # collect separate sets 
     ppl.add(id) 
    return (l,ppl) 

def csv2graph(source): 
    MG=nx.MultiGraph() 
    # Remember that I use integers for edge attributes, to save space! Dic above. 
    # start: 1 
    # end: 2 
    p = Pool() 
    node_divisor = len(p._pool) 
    node_chunks = list(chunks(source,int(len(source)/int(node_divisor)))) 
    num_chunks = len(node_chunks) 
    pedgelists = p.map(csv2nodes, 
         node_chunks) 
    ll = [] 
    ppl = set() 
    for l in pedgelists: 
     ll.append(l[0]) 
     ppl.update(l[1]) 
    MG.add_edges_from(ll) 
    return (MG,ppl) 

with open('/Users/laszlosandor/Dropbox/peers_prisons/python/codetenus_test.txt','r') as source: 
    r = source.readlines() 
    MG,ppl = csv2graph(r) 
+1

मेरे मामले में, मैं गलती से एक 'None' गुजर रहा था scoping के कारण मुद्दे। – ThorSummoner

+0

मेरे पास यह था जब मैं कक्षा को 'क्लास कुछ क्लास (ऑब्जेक्ट) के रूप में घोषित कर रहा था:' भले ही मैंने स्पष्ट रूप से मेरी कक्षा में __exit__ किया हो। एक बार जब मैंने 'ऑब्जेक्ट' से विरासत हटा दी तो यह काम किया। मुझे नहीं पता क्यों, तो वाईएमएमवी – mpag

उत्तर

111

समस्या इस पंक्ति में है:

with pattern.findall(row) as f: 

आप बयान के साथ प्रयोग कर रहे हैं। इसके लिए __enter__ और __exit__ विधियों के साथ एक ऑब्जेक्ट की आवश्यकता है। लेकिन pattern.findalllist लौटाता है, with__exit__ विधि को संग्रहीत करने का प्रयास करता है, लेकिन यह इसे नहीं ढूंढ सकता है, और एक त्रुटि उठाता है। बस

f = pattern.findall(row) 

का उपयोग करें।

39

यह इस उदाहरण में पूछताछ की समस्या नहीं है लेकिन पहले जेनेरिक "एट्रिब्यूट एरर: __exit__" के लिए समस्या निवारण चरण सुनिश्चित करना चाहिए कि ब्रैकेट वहां हैं, उदा।

with SomeEnterExitObject() as foo: 
    #works because a new object is referenced... 

नहीं

with SomeEnterExitObject as foo: 
    #AttributeError because the class is referenced 

समय-समय पर कैच मुझे बाहर और मैं यहाँ अंत -__-

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^