Python'da çoklu işlemde bir "AttributeError: __exit__" sorunu nasıl giderilir?


87

Python 3.2.2'de birden çok çekirdekte çalıştırabilmek için bazı csv okuma kodunu yeniden yazmaya çalıştım. PoolÇalışma örneklerinden uyarladığım (ve zaten benim için projemin başka bir bölümünde çalıştığım) çoklu işlem nesnesini kullanmaya çalıştım . Deşifre etmek ve gidermek zor bulduğum bir hata mesajıyla karşılaştım.

Hata:

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__

İlgili kod:

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)

Bunu gidermenin iyi bir yolu nedir?


1
Benim durumumda, Nonekapsam belirleme sorunları nedeniyle yanlışlıkla bir a geçiyordum .
ThorSummoner

Class SomeClass(object):Sınıfımda açıkça bir çıkış YAPTIĞIM gibi bir sınıfı ilan ederken buna sahiptim . Mirası objectondan kaldırdıktan sonra işe yaradı. Neden olduğuna dair hiçbir fikrim yok, bu yüzden YMMV
mpag

Yanıtlar:


155

Sorun şu satırda:

with pattern.findall(row) as f:

İfadeyi kullanıyorsun with. Bir nesne __enter__ve __exit__yöntemler gerektirir . Ama pattern.findalldöner bir list, withsaklamak çalışır __exit__yöntemi, ancak bulamıyorum ve bir hata yükseltir. Sadece kullan

f = pattern.findall(row)

yerine.


63

Bu örnekte sorun soran kişinin sorunu değildir, ancak genel bir "AttributeError: __exit__" için ilk sorun giderme adımı parantezlerin orada olduğundan emin olmak olmalıdır, ör.

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

değil

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

Zaman zaman beni yakalar ve ben burada olurum -__-


9

Hata, kullanmaya çalışırken de meydana gelir.

with multiprocessing.Pool() as pool:
   # ...

çok eski (Python 2.X gibi) ve withçoklu işlem havuzlarıyla birlikte kullanılmasını desteklemeyen bir Python sürümü ile.

(Daha fazla ayrıntı için bu yanıta bakın https://stackoverflow.com/a/25968716/1426569 başka bir soru için)


Evet! Python 3.X üzerinde harika çalışıyor
Sreekant Shenoy

-1

Bu hatanın nedeni şudur: Flask uygulaması zaten çalışıyor, kapanmadı ve bunun ortasında başka bir örneği başlatmaya çalışıyoruz: with app.app_context (): #Code Bunu ifadeyle kullanmadan önce yapmamız gerekir Önceki çalışan uygulamanın kapsamının kapalı olduğundan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.