복붙노트

[PYTHON] PicklingError : <class 'decimal.Decimal'>을 pickle 할 수 없습니다 : decimal.Decimal과 같은 객체가 아닙니다.

PYTHON

PicklingError : 을 pickle 할 수 없습니다 : decimal.Decimal과 같은 객체가 아닙니다.

이것은 내가 오늘 http://filmaster.com "> filmaster.com에서 얻은 오류입니다 :

그게 정확히 무슨 뜻입니까? 그것은별로 의미가없는 것처럼 보입니다 ... 그것은 장고 캐싱과 연결되어있는 것 같습니다. 여기서 전체 추적을 볼 수 있습니다 :

그리고 Filmaster의 소스 코드는 다음에서 다운로드 할 수 있습니다 : bitbucket.org/filmaster/filmaster-test

어떤 도움이라도 대단히 감사하겠습니다.

해결법

  1. ==============================

    1.jupyter 노트북에서 실행할 때이 오류가 발생했습니다. 문제는 내가 % load_ext 자동로드 자동로드 2를 사용하고 있었다고 생각합니다. 커널을 다시 시작하고 다시 실행하여 문제를 해결했습니다.

    jupyter 노트북에서 실행할 때이 오류가 발생했습니다. 문제는 내가 % load_ext 자동로드 자동로드 2를 사용하고 있었다고 생각합니다. 커널을 다시 시작하고 다시 실행하여 문제를 해결했습니다.

  2. ==============================

    2.Pickle의 한 가지 이상한 점은 인스턴스를 피클 링하기 전에 클래스를 가져 오는 방법이 피클 링 된 객체를 미묘하게 바꿀 수 있다는 것입니다. 피클을 사용하기 전에 피클을 반입하기 전에 피클을 반입해야합니다.

    Pickle의 한 가지 이상한 점은 인스턴스를 피클 링하기 전에 클래스를 가져 오는 방법이 피클 링 된 객체를 미묘하게 바꿀 수 있다는 것입니다. 피클을 사용하기 전에 피클을 반입하기 전에 피클을 반입해야합니다.

    그래서 예를 들면 :

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

    (때로는) 미묘하게 다른 대상을 만듭니다 :

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

    수입품을 만지면 문제가 해결 될 수도 있습니다.

  3. ==============================

    3.__init__을 호출하여 다중 처리로 프로세스를 시작하는 데 문제가있을 수 있습니다. 다음은 데모입니다.

    __init__을 호출하여 다중 처리로 프로세스를 시작하는 데 문제가있을 수 있습니다. 다음은 데모입니다.

    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__
    

    우리가 spawn 대신 fork를 사용하도록 변경하면 :

    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'
    

    그러나 mp.Process 타겟에서 __init__을 호출하지 않는 start_process 메소드를 호출하면 다음과 같이됩니다.

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

    예상대로 작동합니다 (스폰 또는 분기를 사용하는지 여부).

  4. ==============================

    4.어떻게 든 새로 고침 (10 진수), 또는 10 진수 모듈을 Monkeypatch하여 Decimal 클래스를 변경 했습니까? 이것들은 그러한 문제를 일으킬 가능성이 가장 큰 두 가지입니다.

    어떻게 든 새로 고침 (10 진수), 또는 10 진수 모듈을 Monkeypatch하여 Decimal 클래스를 변경 했습니까? 이것들은 그러한 문제를 일으킬 가능성이 가장 큰 두 가지입니다.

  5. ==============================

    5.왜 이것이 실패했는지 설명 할 수는 없지만,이 문제를 해결하기위한 내 자신의 솔루션은 모든 코드를 변경하는 것이 었습니다.

    왜 이것이 실패했는지 설명 할 수는 없지만,이 문제를 해결하기위한 내 자신의 솔루션은 모든 코드를 변경하는 것이 었습니다.

    from point import Point
    

    import point
    

    이 한 가지 변화와 효과가있었습니다. 나는 왜 ... hth인지 알고 싶다.

  6. from https://stackoverflow.com/questions/1412787/picklingerror-cant-pickle-class-decimal-decimal-its-not-the-same-object by cc-by-sa and MIT license