有关python的更多信息ImportError没有命名的模块

时间:2014-08-11 05:48:59

标签: python pickle importerror

根据建议here,我的包(或包含我的模块的目录)位于C:/ Python34 / Lib / site-packages。该目录包含__init__.pysys.path包含目录的路径,如图所示。

enter image description here

我仍然收到以下错误:

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

1 个答案:

答案 0 :(得分:2)

您正在将所有顾客实例(即self)保存到Patron类属性Patron.patrons。然后你试图从类中挑选一个类属性。这可能会阻塞pickle,但我相信dill应该能够处理它。是否真的有必要将所有类实例保存到Patrons中的列表中?这有点奇怪......

pickle通过引用序列化类,并且对于许多对象而言与__main__不兼容。在dill中,您不必通过引用序列化类,它可以更好地处理__main__的问题。在此处获取dillhttps://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。我只是无法重现这一点......我已经完成了。