[PYTHON] PicklingError : <class 'decimal.Decimal'>을 pickle 할 수 없습니다 : decimal.Decimal과 같은 객체가 아닙니다.
PYTHONPicklingError : 을 pickle 할 수 없습니다 : decimal.Decimal과 같은 객체가 아닙니다.
이것은 내가 오늘 http://filmaster.com "> filmaster.com에서 얻은 오류입니다 :
그게 정확히 무슨 뜻입니까? 그것은별로 의미가없는 것처럼 보입니다 ... 그것은 장고 캐싱과 연결되어있는 것 같습니다. 여기서 전체 추적을 볼 수 있습니다 :
그리고 Filmaster의 소스 코드는 다음에서 다운로드 할 수 있습니다 : bitbucket.org/filmaster/filmaster-test
어떤 도움이라도 대단히 감사하겠습니다.
해결법
-
==============================
1.jupyter 노트북에서 실행할 때이 오류가 발생했습니다. 문제는 내가 % load_ext 자동로드 자동로드 2를 사용하고 있었다고 생각합니다. 커널을 다시 시작하고 다시 실행하여 문제를 해결했습니다.
jupyter 노트북에서 실행할 때이 오류가 발생했습니다. 문제는 내가 % load_ext 자동로드 자동로드 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.__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.어떻게 든 새로 고침 (10 진수), 또는 10 진수 모듈을 Monkeypatch하여 Decimal 클래스를 변경 했습니까? 이것들은 그러한 문제를 일으킬 가능성이 가장 큰 두 가지입니다.
어떻게 든 새로 고침 (10 진수), 또는 10 진수 모듈을 Monkeypatch하여 Decimal 클래스를 변경 했습니까? 이것들은 그러한 문제를 일으킬 가능성이 가장 큰 두 가지입니다.
-
==============================
5.왜 이것이 실패했는지 설명 할 수는 없지만,이 문제를 해결하기위한 내 자신의 솔루션은 모든 코드를 변경하는 것이 었습니다.
왜 이것이 실패했는지 설명 할 수는 없지만,이 문제를 해결하기위한 내 자신의 솔루션은 모든 코드를 변경하는 것이 었습니다.
from point import Point
에
import point
이 한 가지 변화와 효과가있었습니다. 나는 왜 ... hth인지 알고 싶다.
from https://stackoverflow.com/questions/1412787/picklingerror-cant-pickle-class-decimal-decimal-its-not-the-same-object by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 어떻게하면 거대한 CSV 파일을 부분적으로 읽을 수 있습니까? (0) | 2018.11.13 |
---|---|
[PYTHON] AES + CTR을 사용한 PyCrypto 문제 (0) | 2018.11.13 |
[PYTHON] 어떻게 아마존 웹 서비스에서 boto3에서 URL을 생성하는 (0) | 2018.11.13 |
[PYTHON] 파이썬에서 고유 한 키로 사전으로 구성된 2 개의 목록 비교 (0) | 2018.11.13 |
[PYTHON] 나누기에 사용할 때 '/'와 '//'의 차이점은 무엇입니까? (0) | 2018.11.13 |