[英]More on python ImportError No module named
根据这里的建议,我的包(或包含我的模块的目录)位于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版 。
您将所有patron实例(即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 dill as pickle
取代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),如果您愿意,那么只需检查是否存在顾客pickle文件...加载到注册表...并且不要做它来自Patrons课程......事情应该会好得多。 您的代码当前正在尝试在构建该类对象时在类定义上加载类实例。 那很糟...
此外,当您没有提供最小的测试用例或有关如何创建回溯的足够信息时,不要指望人们下载您的代码并为您调试它。 对于某些暗角情况,您可能在dill
遇到了有效的酸洗错误,但我无法告诉b / c我无法重现您的错误。 但是,我可以说你需要一些重构。
而且要明确:
将您的顾客从patrons.py
初始化混乱转移到新文件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
。 我只是无法重现这一点......我已经完成了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.