关于pickle:有关python的更多信息ImportError没有名为的模块

More on python ImportError No module named

根据这里的建议,我的包(或包含我的模块的目录)位于c:/python34/lib/site packages。目录包含一个__init__.pysys.path包含目录的路径,如图所示。

enter image description here

但我仍然收到以下错误:

1
2
3
4
5
6
7
8
9
10
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'

我有一个名为"provider"的provider.py类,但没有名为provider的模块,所以我不确定错误消息中的最后一条语句是什么意思。我非常感谢你对我所缺少的东西的看法。

在Windows32位计算机上运行python版本3.4.1。


您正在将所有用户实例(即self保存到Patron类属性Patron.patrons中。然后,您将尝试从类内pickle类属性。这会使pickle窒息,但我相信dill应该能够处理。是否确实需要将所有类实例保存到用户列表中?做这件事有点奇怪…

pickle通过引用序列化类,但对于许多对象来说,它不能很好地与__main__配合使用。在dill中,不必通过引用序列化类,它可以处理__main__的问题,效果更好。获取dill网址:https://github.com/uqfoundation

编辑:我试过你的代码(只做了一个小改动),它起作用了。

1
dude@hilbert>$ python patronmaker.py

然后启动python…

1
2
3
4
5
>>> 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

所以,即使通过下载和运行您的代码,我也不能在dill中产生错误。我使用的是Github最新的dill

附加编辑:你上面的回溯来自一个ImportError。您安装模块了吗?如果您没有使用setup.py来安装它,或者您的PYTHONPATH上没有您的模块,那么无论您如何序列化,都不会找到您的模块。

更多编辑:看看你的代码,你应该为patrons使用singleton模式……它不应该在class Patron中。类级别的代码块用于将用户加载到Patron.patrons中,这肯定会导致问题……而且可能是某种形式的错误的来源。我还看到你在从patrons类中删除属性Patrons.patrons(甚至不是类本身),这太疯狂了,不要这样做。另外请注意,当您试图获得用户时,您使用Patron.patrons…这是调用类对象而不是实例。将赞助人移出班级,并直接使用单例作为赞助人列表。另外,您通常应该使用赞助人实例,因此,如果您想让每个赞助人知道其他所有赞助人是谁,p = Patron('Joe', 'Blow'),那么p.patrons,以获得所有赞助人……但您需要编写一个Patrons.load方法,读取单例赞助人列表……您还可以使用property使load给出y你看起来像个属性。

如果你建立了一个单一的顾客(作为一个名单)或"注册"的顾客(作为一个口述),如果你喜欢,然后检查是否有一个顾客腌菜文件存在…加载到注册表…不要从内部的顾客类做…事情应该好多了。您的代码当前正试图在类定义构建类对象时加载类实例。那太糟糕了…

另外,不要期望人们去下载你的代码并为你调试它,当你没有提供一个最小的测试用例或者没有足够的信息来说明如何创建回溯时。你可能在dill中发现了一个有效的酸洗错误,因为有些黑角箱子,但我不能告诉B/C我不能复制你的错误。但是,我可以告诉您需要一些重构。

只是要明确一点:

将您的用户从用户初始化mess移到新文件patrons.py中。

1
2
3
4
5
6
7
8
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和其他任何地方你都需要单身汉…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。我就是不能复制这个…我已经完成了。