2017-12-08 11 views
1

を取得できません。 pickleを介してオブジェクトのリスト(locations)を格納する必要があります。あなたが保存したファイルが.config/autosave.binで保存されて見ることができるようにはAttributeError unpickle化している間:私は在庫システムのためのPython CGIスクリプトを書いている属性「場所」

/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クラスの定義が必要です。そうでなければ、そのクラスのカスタムオブジェクトを再構築することはできません。ここ

# 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のクラス定義を有することなく、ピクルスファイルを読み込もうとし例である:

>>> 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)> 

しかし、クラスへのアクセスを定義:

>>> 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() '呼び出しの前に定義され、完全に動作するように変更しました。ありがとう! –

関連する問題