【问题标题】:Python3 Cannot pickle self-defined objectsPython3 无法腌制自定义对象
【发布时间】:2020-01-09 14:24:49
【问题描述】:

在将项目从 Python2 移动到 Python3 后,我不再能够腌制自己的对象。重申一下,在 python 2.7.2 中我没有任何问题,我得到了

_pickle.PicklingError: Can't pickle <class 'mtgt.MTGTree'>: import of module 'mtgt' failed

我在网上做了一些搜索,听起来这与我导入对象的方式有关。我在 Linux 上使用 Python 3.5.2/GCC 5.4.0 20160609。作为背景,我有一个具有以下结构的项目

* Lituus
  - \_\_init\_\_.py
  - lituus
    + \_\_init\_\_.py
    + mtg.py
    + multiverse.py
    + mtgcard.py
    + mtgl
       * \_\_init\_\_.py
       * mtgl.py
       * tagger.py
       * lexer.py
       * parser.py
       * grapher.py
       * mtgt.py
       * list_util.py 

我在 /usr/lib/python3/dist-packages 中有一个 litus.pth 文件,因此我可以从任何目录中的命令提示符运行 python3 并导入我的项目文件

我想腌制在 mtgt.py 中定义的 MTGTree 对象。现在,如果我从包含 mtgt 和 import mtgt 的目录中运行 python3,我会转储对象

>>> import mtgt
>>> import pickle
>>> fout = open('test.pkl','wb')
>>> pickle.dump(t,fout)
>>> fout.close()
>>> exit()

并加载对象

>>> import mtgt
>>> import pickle
>>> fin = open('test.pkl','rb')
>>> t = pickle.load(fin)
>>> t.root
'root'
>>> fin.close()
>>> exit()

而且,我什至可以从任何地方运行 python3 并加载腌制树

>>> import lituus.mtgl.mtgt as mtgt
>>> import pickle
>>> fin = open('test.pkl','rb')
>>> t=pickle.load(fin)
>>> fin.close()
>>> t.root
'root'
>>> exit()

当我尝试使用 import.mtgl.mtgt as mtgt 转储树时出现问题

>>> import lituus.mtgl.mtgt as mtgt
>>> import pickle
>>> t = mtgt.MTGTree()
>>> t.root
'root'
>>> fout = open('test.pkl','wb')
>>> pickle.dump(t,fout)

这导致前面提到的 _pickle.PicklingError: Can't pickle : import of module 'mtgt' failed

那么,显然我在这里做错了,但是 WTF?这在 Python 2.7 中没有问题,使用 pickle 加载腌制文件也没有问题。

我找不到任何具体的东西,希望你们中的一个人有一些见解。谢谢。

【问题讨论】:

    标签: python-3.x pickle


    【解决方案1】:

    [已解决] 因此,在我的 python 文件中,我为module.__doc__ 文档字符串设置了一个变量列表。其中之一是__name__。在对此进行评论后,酸洗效果很好。我猜这是我的愚蠢错误,但 Python 2.7 没有任何问题仍然困扰着我。

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2020-04-07
      • 1970-01-01
      • 2017-10-23
      • 2013-08-18
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多