根据建议here,我的包(或包含我的模块的目录)位于C:/ Python34 / Lib / site-packages。该目录包含__init__.py
,sys.path
包含目录的路径,如图所示。
我仍然收到以下错误:
Traceback (most recent call last):
File "C:/Python34/Lib/site-packages/toolkit/window.py", line 6, in <module>
from catalogmaker import Catalog
File "C:\Python34\Lib\site-packages\toolkit\catalogmaker.py", line 1, in <module>
from patronmaker import Patron
File "C:\Python34\Lib\site-packages\toolkit\patronmaker.py", line 4, in <module>
class Patron:
File "C:\Python34\Lib\site-packages\toolkit\patronmaker.py", line 11, in Patron
patrons = pickle.load(f)
ImportError: No module named 'Patron'
我在patronmaker.py中有一个名为'Patron'但没有名为Patron的模块,所以我不确定错误信息中的最后一个语句是什么意思。我非常感谢你对我所缺少的想法。
Windows 32位计算机上的Python版本3.4.1 。
答案 0 :(得分:2)
您正在将所有顾客实例(即self
)保存到Patron
类属性Patron.patrons
。然后你试图从类中挑选一个类属性。这可能会阻塞pickle
,但我相信dill
应该能够处理它。是否真的有必要将所有类实例保存到Patrons中的列表中?这有点奇怪......
pickle
通过引用序列化类,并且对于许多对象而言与__main__
不兼容。在dill
中,您不必通过引用序列化类,它可以更好地处理__main__
的问题。在此处获取dill
:https://github.com/uqfoundation
修改强> 我尝试了你的代码(只做了一点小改动),然后就可以了。
dude@hilbert>$ python patronmaker.py
然后启动python ...
>>> import dill
>>> f = open('patrons.pkl', 'rb')
>>> p = dill.load(f)
>>> p
[Julius Caeser, Kunte Kinta, Norton Henrich, Mother Teresa]
我所做的唯一改变是取消注释patronmaker.py
末尾的行,以便节省一些顾客.......我还用import pickle
替换了import dill as pickle
。
因此,即使下载并运行代码,我也无法使用dill
生成错误。我正在使用github的最新dill
。
其他编辑:
您上面的追溯来自ImportError
。你安装了模块吗?如果您没有使用setup.py进行安装,或者如果您的PYTHONPATH
上没有模块,那么无论您如何序列化,都无法找到模块。
更多修改:
查看代码,您应该使用patrons
的单例模式 ...它不应该在class Patron
内。用于将顾客加载到Patron.patrons
的类级别的代码块肯定会导致问题......并且可能必然会成为某种形式的错误的来源。我也看到你正在Patrons.patrons
类中挑选属性Patrons
(甚至不是类本身) - 这是疯狂 - 不要这样做。另请注意,当您尝试获取顾客时,使用Patron.patrons
...这是调用类对象而不是实例。将顾客移到课堂外,并直接使用单身人士作为顾客列表。你通常也应该使用顾客实例,所以如果你想让每个顾客知道所有其他顾客是谁p = Patron('Joe', 'Blow')
,那么p.patrons
来获得所有顾客......但你需要写一个Patrons.load
方法,用于读取单个顾客列表...您还可以使用property
使load
为您提供看似属性的内容。
如果您构建一个单独的顾客(作为列表)...或者顾客的“注册表”(作为dict),如果您愿意,那么只需检查是否存在顾客泡菜文件......加载到注册表...并且不要不要在Patrons课堂内做这件事......事情应该会好得多。您的代码当前正在尝试在类定义上加载类实例,而构建该类对象。那太糟糕了......
此外,当您没有提供最小的测试用例或有关如何创建回溯的足够信息时,不要指望人们下载您的代码并为您调试它。
对于某些暗角情况,可能在dill
中遇到了有效的酸洗错误,但我无法告诉b / c我无法重现您的错误。但是,我可以说你需要进行一些重构。
只是要明确:
将您的顾客从Patrons初始化混乱转移到新文件patrons.py
import os
import dill as pickle
#Initialize patrons with saved pickle data
if os.path.isfile('patrons.pkl'):
with open("patrons.pkl", 'rb') as f:
patrons = pickle.load(f)
else: patrons = []
然后在patronmaker.py,以及其他任何地方,你需要单身......
import dill as pickle
import os.path
import patrons as the
class Patron:
def __init__(self, lname, fname):
self.lname = lname.title()
self.fname = fname.title()
self.terrCheckedOutHistory = {}
#Add any created Patron to patrons list
the.patrons.append(self)
#Preserve this person via pickle
with open('patrons.pkl', 'wb') as f:
pickle.dump(the.patrons, f)
你应该没事,除非你的代码遇到一种情况,即模块上的属性无法序列化,因为它们是动态添加的(参见https://github.com/uqfoundation/dill/pull/47),这肯定会使pickle
失败,在某些情况下dill
也可能......模块上可能有AtrributeError
。我只是无法重现这一点......我已经完成了。