pickle 객체 저장 후 load 시 AttributeError 해결 방법

이성범·2022년 5월 20일
0

Development

목록 보기
7/7
  • pickle을 이용해 객체를 저장하고 객체를 불러올 때 객체를 만든 class가 정의되어 있지 않다면 AttributeError를 발생한다.

# ex1.py
import pickle

class Myclass():
	#TODO

my_obj = Myclass()

## 저장
with open('파일명.pickle', 'wb') as file:
    pickle.dump(my_obj, file)

# ex2.py
import pickle
with open('파일명.pickle', 'rb') as file:
	load_my_obj= pickle.load(file)
    ## AttributeError O

class Myclass():
   #TODO
   
with open('파일명.pickle', 'rb') as file:
	load_my_obj= pickle.load(file)
    ## AttributeError X
  • 또한 실행 되는 py 파일에 __module_name이 "__main__"이 아니라면 AttributeError를 발생시키기 때문에 클래스가 로드된 __module_name으로 변경시켜줘야 한다.

# ex3.py
import pickle
from .ex1 import Myclass
with open('파일명.pickle', 'rb') as file:
	load_my_obj= pickle.load(file)

def get_load_my_obj():
	return load_my_obj

# ex4.py
import pickle
from .ex1 import Myclass

class MyCoustomUnpickler(pickle.Unpickler):
    def find_class(self, __module_name: str, __global_name: str):
        if __module_name == '__main__':
            __module_name = __name__ # __module_name을 현재 실행되는 파일의 __name__으로 변경
        return super().find_class(__module_name, __global_name)

with open('파일명.pickle', 'rb') as file:
    load_my_obj = MyCoustomUnpickler(file)
	load_my_obj = load_my_obj.load()

def get_load_my_obj():
	return load_my_obj

# ex5.py
from .ex3 import get_load_my_obj as ex3
from .ex4 import get_load_my_obj as ex4

if __name__ == '__main__':
  load_my_obj = ex3() ## AttributeError O
  load_my_obj = ex4() ## AttributeError X

profile
Machine Learning Engineer at Konan Technology

0개의 댓글