【发布时间】: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