2009-09-06 2 views
5

Python 3 클래스가 프로토콜 2를 사용하여 pickle 처리되면 Python 2에서 작동하지만 Python 3 클래스는 Python 2에서 작동하도록되어 있지만 불행히도 일부 클래스의 이름이 변경 되었기 때문에 실패합니다.Python 2에서 Python 3의 클래스를 비 꾸미기

다음과 같은 코드가 있다고 가정 해 보겠습니다.

보낸 사람

pickle.dumps(obj,2) 

수신기

pickle.loads(atom) 

obj={} 있다면, 주어진 오류는 특정 케이스를 제공하려면 : 파이썬 2 대신 __builtin__을 사용하기 때문이다

ImportError: No module named builtins

.

이 문제를 해결하는 가장 좋은 방법은 질문입니다.

답변

13

이 문제는 Python issue 3675입니다. 이 버그는 실제로 Python 3.11에서 수정되었습니다.

우리가 가져 오는 경우 :

from lib2to3.fixes.fix_imports import MAPPING 

매핑 파이썬 3 명에 파이썬이 이름을 매핑합니다. 우리는 이것을 역으로 원한다.

REVERSE_MAPPING={} 
for key,val in MAPPING.items(): 
    REVERSE_MAPPING[val]=key 

우리는 Unpickler로드

class Python_3_Unpickler(pickle.Unpickler): 
    """Class for pickling objects from Python 3""" 
    def find_class(self,module,name): 
     if module in REVERSE_MAPPING: 
      module=REVERSE_MAPPING[module] 
     __import__(module) 
     mod = sys.modules[module] 
     klass = getattr(mod, name) 
     return klass 

def loads(str): 
    file = pickle.StringIO(str) 
    return Python_3_Unpickler(file).load() 

우리는 다음 대신 pickle.loads의 부하를 호출을 대체 할 수 있습니다.

이렇게하면 문제가 해결됩니다.

관련 문제