2011-09-16 19 views
61

Python 3.2.2'de birden çok çekirdekte çalıştırabilmek için bazı csv okuma kodunu yeniden yazmayı denedim. Çalışma örneklerinden uyarladığım ve daha önce benim projemin başka bir parçası için benim için çalıştığım çoklu işlem havuzu nesnesini kullanmaya çalıştım. Çözmek ve gidermek için zor bulduğum bir hata mesajıyla karşılaştım. Bu sorunu gidermek için iyi bir yol nedir? Teşekkürler!Python'da çoklu düzeltme için bir "AttributeError: __exit__" sorunu nasıl giderilir?

hatası:

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__ 

ilgili kodu:

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

i yanlışlıkla kapsam nedeniyle bir 'None' geçiyordu değil sorunlar. – ThorSummoner

+0

Sınıfımın bir __exit __ olduğunu bilmeme rağmen bir sınıfı “Class SomeClass (object):” olarak bildirdiğimde bunu yaşadım. Bir kez mirasını 'nesneden' kaldırdım, işe yaradı. Neden olduğu hakkında fikrim yok, YMMV – mpag

cevap

111

sorun bu satırda geçerli:

with pattern.findall(row) as f: 

Sen ifadesiyle kullanıyorsunuz. __enter__ ve __exit__ yöntemleriyle bir nesne gerektirir. Ancak pattern.findall, list döndürür, with, __exit__ yöntemini depolamayı dener, ancak bu dosyayı bulamaz ve bir hata oluşturur. Bunun yerine

kullanın.

39

Bu örnekte, sorgunun sorunu değil, numaralı ilk genel bir "AttributeError: __exit__" sorun giderme adımı, köşeli ayraçların olduğundan emin olmanız gerekir, örn.

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

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

zaman zaman dışarı yakalar beni ve ben burada sona -__- Benim durumumda

İlgili konular