2017-12-08 23 views
1

인벤토리 시스템 용 Python CGI 스크립트를 작성하고 있습니다. pickle을 통해 객체 목록 (locations)을 저장해야합니다. 당신은 저장 파일이 .config/autosave.bin에 저장되어 볼 수 있듯이속성 해제 중에 오류가 발생했습니다 : '위치'속성을 가져올 수 없습니다.

/Applications/MAMP/cgi-bin/ic/main.py in() 
    16 try: 
    17   with open(".config/autosave.bin", "rb") as dataFile: 
=> 18     locations = pickle.load(dataFile) 
    19 except (FileNotFoundError, PermissionError): 
    20   dispHTML("p", contents="Error in load: Save file incorrectly configured!") 
AttributeError: Can't get attribute 'Location' on <module '__main__' from '/Applications/MAMP/cgi-bin/ic/main.py'> 
     args = ("Can't get attribute 'Location' on <module '__main__' from '/Applications/MAMP/cgi-bin/ic/main.py'>",) 
     with_traceback = <built-in method with_traceback of AttributeError object> 

:

try: 
    with open(".config/autosave.bin", "rb") as dataFile: 
     locations = pickle.load(dataFile) 
except (FileNotFoundError, PermissionError): 
    dispHTML("p", contents="Error in load: Save file incorrectly configured!") 
    locations = [] 

그러나,이 결과 : 여기에 내가 사용하고 코드입니다. 그것에 쓰는 것은 이 잘 작동하려면 인 것 같지만 확인할 수 없었습니다.

어떻게 해결할 수 있습니까?

답변

1

피클 읽기 코드에는 Location 클래스의 정의가 필요합니다. 그렇지 않으면 해당 클래스의 사용자 지정 개체를 다시 구성 할 수 없습니다. 클래스에 대한 액세스,

>>> import pickle 
>>> with open('.config/autosave.bin','rb') as f: 
...  data = pickle.load(f) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
AttributeError: Can't get attribute 'Location' on <module '__main__' (built-in)> 

그러나 다음은

# config_writer.py 

import pickle 

class Location: 
    def __init__(self, store, aisle): 
     self.store = store 
     self.aisle = aisle 

locations = [Location(i, i) for i in range(10)] 
with open('.config/autosave.bin', 'wb') as f: 
    pickle.dump(locations, f) 

Location의 클래스 정의 (다른 터미널/세션에서이 코드를 실행)을하지 않고 피클 파일을 읽으려고 예이다 정의 :

>>> from config_writer import Location 
>>> with open('.config/autosave.bin','rb') as f: 
...  data = pickle.load(f) 
>>> data 
[<config_writer.Location object at 0x7f8b472111d0>, <config_writer.Location object at 0x7f8b41ad6e48>, <config_writer.Location object at 0x7f8b41adb0f0>, <config_writer.Location object at 0x7f8b41adb128>, <config_writer.Location object at 0x7f8b41adb160>, <config_writer.Location object at 0x7f8b41adb198>, <config_writer.Location object at 0x7f8b41adb1d0>, <config_writer.Location object at 0x7f8b41adb208>, <config_writer.Location object at 0x7f8b41adb240>, <config_writer.Location object at 0x7f8b41adb278>] 

희망의 코드 피클 파일을 읽는 다른 모듈에서 Location의 클래스 정의를 가져올 수 내 예를 들어.

+0

'Location' 클래스는'Pickle'을 호출하는 코드와 동일한 코드로 정의됩니다. 필자는'Location'이'pickle.load()'호출 이전에 정의되도록 완벽하게 작동하도록 변경했습니다. 감사! –