2009-09-11 13 views
16

यह त्रुटि है जो मुझे आज मिली है http://filmaster.com "> filmaster.com:पिकलिंग एरर: <class 'दशमलव नहीं चुन सकता है। दशमलव:> यह दशमलव के समान वस्तु नहीं है। दशमलव

PicklingError: Can't pickle : it's not the same object as decimal.Decimal

क्या है कि वास्तव में मतलब यह भावना का एक बहुत ... यह Django कैशिंग के साथ जोड़ा जा रहा है बना प्रतीत नहीं होता है आप यहाँ पूरे ट्रैस बैक देख सकते हैं:?।

Traceback (most recent call last):

File "/home/filmaster/django-trunk/django/core/handlers/base.py", line 92, in get_response response = callback(request, *callback_args, **callback_kwargs)

File "/home/filmaster/film20/film20/core/film_views.py", line 193, in show_film
workflow.set_data_for_authenticated_user()

File "/home/filmaster/film20/film20/core/film_views.py", line 518, in set_data_for_authenticated_user
object_id = self.the_film.parent.id)

File "/home/filmaster/film20/film20/core/film_helper.py", line 179, in get_others_ratings
set_cache(CACHE_OTHERS_RATINGS, str(object_id) + "_" + str(user_id), userratings)

File "/home/filmaster/film20/film20/utils/cache_helper.py", line 80, in set_cache return cache.set(CACHE_MIDDLEWARE_KEY_PREFIX + full_path, result, get_time(cache_string))

File "/home/filmaster/django-trunk/django/core/cache/backends/memcached.py", line 37, in set
self._cache.set(smart_str(key), value, timeout or self.default_timeout)

File "/usr/lib/python2.5/site-packages/cmemcache.py", line 128, in set val, flags = self._convert(val)

File "/usr/lib/python2.5/site-packages/cmemcache.py", line 112, in _convert val = pickle.dumps(val, 2)

PicklingError: Can't pickle : it's not the same object as decimal.Decimal

और फिल्मस्टर के लिए स्रोत कोड यहां से डाउनलोड किया जा सकता है: bitbucket.org/filmaster/filmaster-test

किसी भी मदद की सराहना की जाएगी।

+0

मुझे किसी अचार के __getstate__ विधि को अपने अचार व्यवहार को बदलने के लिए एक समान त्रुटि मिली है। सुनिश्चित नहीं है कि समस्या क्या है लेकिन उनमें से किसी के लिए जांच करें। – partofthething

+0

मैंने इसे कक्षा सजावटकर्ताओं के साथ भी देखा है, विशेष रूप से छः .add_metaclass – dbn

उत्तर

16

पिकल की एक विषमता यह है कि जिस तरह से आप किसी एक के उदाहरण को चुनने से पहले कक्षा आयात करते हैं, वह मसालेदार वस्तु को बदल सकता है। अचार के लिए आपको इसे अचार करने से पहले और इसे अनपिक करने से पहले ऑब्जेक्ट को समान रूप से आयात करने की आवश्यकता होती है। करने के लिए

from a.b import c 
C = c() 
pickler.dump(C) 

एक आसानी से विभिन्न वस्तु (कभी कभी) कर देगा:

from a import b 
C = b.c() 
pickler.dump(C) 

अपने आयात के साथ नगण्य की कोशिश करें, यह समस्या को ठीक कर सकते हैं

उदाहरण के लिए

तो।

+8

तो यह पिकलिंग समस्या केवल हजारों अनुरोधों में एक बार कैसे होती है और आमतौर पर यह ठीक काम करता है? – michuk

2

क्या आपने किसी भी तरह reload(decimal), या दशमलव मॉड्यूल को बदलने के लिए दशमलव मॉड्यूल को बंद कर दिया है? ये ऐसी चीजें हैं जो ऐसी समस्या उत्पन्न करने की संभावना रखते हैं।

+0

कोई नहीं, उस तरह से कुछ भी नहीं। मैं केवल दशमलव वर्ग आयात कर रहा हूं। – michuk

17

मुझे एक जुपीटर नोटबुक में चलते समय यह त्रुटि मिली। मुझे लगता है कि समस्या यह थी कि मैं %load_ext autoreloadautoreload 2 का उपयोग कर रहा था। मेरे कर्नेल को पुनरारंभ करना और समस्या को हल करना पुन: हल करना।

+0

ऐसा लगता है कि कक्षा विधि को बदलने से समस्या का कारण होता है। मेरा अनुमान है कि 'autoreload' कहीं और सहेजी गई परिभाषा को अद्यतन नहीं कर रहा है। पुनरारंभ करना इसे ठीक करेगा क्योंकि नई परिभाषा दोनों जगहों पर लोड की जाती है। – theindigamer

2

__init__ पर कॉल करके multiprocessing के साथ प्रक्रिया शुरू करने में समस्याएं हो सकती हैं। , ऊपर कोड के साथ अब

import multiprocessing as mp 

class SubProcClass: 
    def __init__(self, pipe, startloop=False): 
     self.pipe = pipe 
     if startloop: 
      self.do_loop() 

    def do_loop(self): 
     while True: 
      req = self.pipe.recv() 
      self.pipe.send(req * req) 

class ProcessInitTest: 
    def __init__(self, spawn=False): 
     if spawn: 
      mp.set_start_method('spawn') 
     (self.msg_pipe_child, self.msg_pipe_parent) = mp.Pipe(duplex=True) 

    def start_process(self): 
     subproc = SubProcClass(self.msg_pipe_child) 
     self.trig_proc = mp.Process(target=subproc.do_loop, args=()) 
     self.trig_proc.daemon = True 
     self.trig_proc.start() 

    def start_process_fail(self): 
     self.trig_proc = mp.Process(target=SubProcClass.__init__, args=(self.msg_pipe_child,)) 
     self.trig_proc.daemon = True 
     self.trig_proc.start() 

    def do_square(self, num): 
     # Note: this is an synchronous usage of mp, 
     # which doesn't make sense. But this is just for demo 
     self.msg_pipe_parent.send(num) 
     msg = self.msg_pipe_parent.recv() 
     print('{}^2 = {}'.format(num, msg)) 

, अगर हम इस चलाएँ:: यहाँ एक डेमो है

if __name__ == '__main__': 
    t = ProcessInitTest(spawn=True) 
    t.start_process_fail() 
    for i in range(1000): 
     t.do_square(i) 

हम इस त्रुटि मिलती है:

Traceback (most recent call last): 
    File "start_class_process1.py", line 40, in <module> 
    t.start_process_fail() 
    File "start_class_process1.py", line 29, in start_process_fail 
    self.trig_proc.start() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/context.py", line 212, in _Popen 
    return _default_context.get_context().Process._Popen(process_obj) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/context.py", line 274, in _Popen 
    return Popen(process_obj) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/popen_spawn_posix.py", line 33, in __init__ 
    super().__init__(process_obj) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/popen_fork.py", line 21, in __init__ 
    self._launch(process_obj) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/popen_spawn_posix.py", line 48, in _launch 
    reduction.dump(process_obj, fp) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/reduction.py", line 59, in dump 
    ForkingPickler(file, protocol).dump(obj) 
_pickle.PicklingError: Can't pickle <function SubProcClass.__init__ at 0x10073e510>: it's not the same object as __main__.__init__ 

और यदि हम fork उपयोग करने के लिए इसे बदल spawn के बजाय:

if __name__ == '__main__': 
    t = ProcessInitTest(spawn=False) 
    t.start_process_fail() 
    for i in range(1000): 
     t.do_square(i) 

हम इस त्रुटि मिलती है:

Process Process-1: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/process.py", line 254, in _bootstrap 
    self.run() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: __init__() missing 1 required positional argument: 'pipe' 

लेकिन अगर हम start_process विधि है, जो mp.Process लक्ष्य में __init__ फोन नहीं करता है, इस तरह कहते हैं: (हम चाहे

if __name__ == '__main__': 
    t = ProcessInitTest(spawn=False) 
    t.start_process() 
    for i in range(1000): 
     t.do_square(i) 

यह काम करता है के रूप में उम्मीद spawn या fork का उपयोग करें)।

0

मैं क्यों इस या तो विफल हो रहा है व्याख्या कर सकते हैं नहीं है, लेकिन अपने ही इसे ठीक करने के समाधान

import point 

इस एक परिवर्तन के लिए

from point import Point 

करने से मेरे सारे कोड को बदलने के लिए था और यह काम किया। मुझे यह जानना अच्छा लगेगा कि क्यों ... hth

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