解封时出现属性错误:无法获取属性“位置”

2024-03-09

我正在为库存系统编写 Python CGI 脚本。需要通过存储pickle一个列表(称为locations)的对象。这是我正在使用的代码:

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 = []

然而,这会导致:

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

如您所见,保存文件存储在.config/autosave.bin。写给它seems工作正常,但我无法检查。

我怎样才能解决这个问题?


pickle 读取代码需要定义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)

这是一个尝试在没有类定义的情况下读取 pickle 文件的示例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>]

希望读取 pickle 文件的代码能够导入类定义Location来自其他一些模块,就像我的示例一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解封时出现属性错误:无法获取属性“位置” 的相关文章

随机推荐