पायथन में मल्टीप्रोसेसिंग में एक "एट्रीब्यूट: __exit__" का निवारण कैसे करें?


87

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

त्रुटि:

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स्कूपिंग मुद्दों के कारण गलती से गुजर रहा था ।
थोरसुमोनर

मेरे पास यह तब था जब मैं एक वर्ग की घोषणा कर रहा था, Class SomeClass(object):भले ही मैं स्पष्ट रूप से मेरी कक्षा में बाहर निकला हो। एक बार जब मैंने objectकाम से विरासत को हटा दिया । मुझे पता नहीं क्यों, इसलिए YMMV
mpag

जवाबों:


154

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

with pattern.findall(row) as f:

आप withकथन का उपयोग कर रहे हैं । यह के साथ एक वस्तु की आवश्यकता है __enter__और __exit__तरीकों। लेकिन pattern.findallएक रिटर्न देता है list, विधि withको स्टोर करने की कोशिश करता है __exit__, लेकिन यह इसे नहीं ढूंढ सकता है, और एक त्रुटि उठाता है। महज प्रयोग करें

f = pattern.findall(row)

बजाय।


62

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

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

नहीं

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

समय-समय पर मुझे बाहर निकालता है और मैं यहाँ समाप्त करता हूं -__


9

त्रुटि का उपयोग करते समय भी होता है

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

एक पायथन संस्करण के साथ जो बहुत पुराना है (जैसे पायथन 2.X) और withमल्टीप्रोसेसिंग पूल के साथ मिलकर उपयोग करने का समर्थन नहीं करता है ।

( अधिक जानकारी के लिए किसी अन्य प्रश्न के लिए यह उत्तर https://stackoverflow.com/a/25968716/1426569 देखें)


हां! पायथन 3. एक्स पर महान काम करना
श्रीकांत शेनॉय

-1

इस त्रुटि के पीछे का कारण है: फ्लास्क ऐप पहले से ही चल रहा है, बंद नहीं हुआ है और इसके बीच में हम इसके द्वारा एक और उदाहरण शुरू करने की कोशिश करते हैं: app.app_context () के साथ: # कोड इससे पहले कि हम इस कथन का उपयोग करें, हमें इसे बनाने की आवश्यकता है सुनिश्चित करें कि पिछले चल रहे ऐप का दायरा बंद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.