pickle, dill - ImportError: No module named moduleA.moduleB.moduleC
pickle, dill - ImportError: No module named moduleA.moduleB.moduleC
我对文件中的 pickle.load()
有疑问。转储和加载在 dill_read_write.py
:
中完成
dill_read_write.py
import os
import dill
from contact_geometry import ContactGeometry
def write_pickle(obj, filename):
os.chdir(os.path.abspath(os.path.join(os.path.dirname(__file__))))
filename = os.path.join(os.getcwd(), filename)
with open(filename, 'wb') as output_:
dill.dump(obj, output_)
def read_pickle(filename):
with open(filename, 'rb') as input_:
return dill.load(input_)
if __name__ == "__main__":
read_pickle("ground_.pkl")
当 PyQt 应用程序(项目)运行ning 时,将对象 ContactGeometry
数据保存到 pickle 文件中。在 moduleC.py
:
中调用函数 write()
moduleC.py
from contact_geometry import ContactGeometry
from moduleA.moduleB import dill_read_write
class Foo(FooItem):
def __init__(self,...):
...
def createGeometry(self):
contact_geometry_ = ContactGeometry()
# save object to pickle file
dill_read_write.write_pickle(contact_geometry_, "object_data.pkl")
对象已保存,pickle 文件已创建。但是当我 运行 只有文件 dill_read_write.py
从 pickle 文件读取(加载)对象数据时,我得到以下错误:
Traceback (most recent call last):
File "C:\projectName\moduleA\moduleB\dill_read_write.py", line 29, in <module>
read("ground_.pkl")
File "C:\projectName\moduleA\moduleB\dill_read_write.py", line 24, in read
return dill.load(input_)
File "C:\Python27\lib\site-packages\dill-0.2.2-py2.7.egg\dill\dill.py", line 199, in load
obj = pik.load()
File "C:\Python27\Lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python27\Lib\pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "C:\Python27\lib\site-packages\dill-0.2.2-py2.7.egg\dill\dill.py", line 278, in find_class
return StockUnpickler.find_class(self, module, name)
File "C:\Python27\Lib\pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named moduleA.moduleB.contact_geometry
我搜索了一下,发现 dill
的性能比 pickle
和 class 更好,但我在实现它时遇到了问题。我还发现我必须在文件 contact_geometry.py
.
中的 class ContactGeometry
中实现 __reduce__()
contact_geometry.py
class ContactGeometry(object):
def __init__(self, ...):
...
def __reduce__(self):
return (self.__class__, (os.path.realpath(__file__))
但是我不确定return这个方法应该是什么?我如何才能从当前情况成功加载 pickle 文件?
下面是项目结构,如果有帮助的话。
你不能运行一个python文件来自这样的包;它不会找到顶级包名称。我建议以下任何一项:
我是 dill
的作者。很难说出你是如何 运行 代码的,但看起来问题是你是 运行 代码和模块名称的一种方式,如@Antti Haapala 的回答。他的建议也很不错。
我会添加这个……您需要确保 (1) moduleA.moduleB.contact_geometry
在 PYTHONPATH
上,并且 (2) 您没有将模块转储为 __main__.moduleB.contact_geometry
并尝试将其加载为 moduleA.moduleB.contact_geometry
-- dill
将 __main__
视为一个模块(大部分情况下)。
但是,您不需要向 类 添加 __reduce__
方法。
我对文件中的 pickle.load()
有疑问。转储和加载在 dill_read_write.py
:
dill_read_write.py
import os
import dill
from contact_geometry import ContactGeometry
def write_pickle(obj, filename):
os.chdir(os.path.abspath(os.path.join(os.path.dirname(__file__))))
filename = os.path.join(os.getcwd(), filename)
with open(filename, 'wb') as output_:
dill.dump(obj, output_)
def read_pickle(filename):
with open(filename, 'rb') as input_:
return dill.load(input_)
if __name__ == "__main__":
read_pickle("ground_.pkl")
当 PyQt 应用程序(项目)运行ning 时,将对象 ContactGeometry
数据保存到 pickle 文件中。在 moduleC.py
:
write()
moduleC.py
from contact_geometry import ContactGeometry
from moduleA.moduleB import dill_read_write
class Foo(FooItem):
def __init__(self,...):
...
def createGeometry(self):
contact_geometry_ = ContactGeometry()
# save object to pickle file
dill_read_write.write_pickle(contact_geometry_, "object_data.pkl")
对象已保存,pickle 文件已创建。但是当我 运行 只有文件 dill_read_write.py
从 pickle 文件读取(加载)对象数据时,我得到以下错误:
Traceback (most recent call last):
File "C:\projectName\moduleA\moduleB\dill_read_write.py", line 29, in <module>
read("ground_.pkl")
File "C:\projectName\moduleA\moduleB\dill_read_write.py", line 24, in read
return dill.load(input_)
File "C:\Python27\lib\site-packages\dill-0.2.2-py2.7.egg\dill\dill.py", line 199, in load
obj = pik.load()
File "C:\Python27\Lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python27\Lib\pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "C:\Python27\lib\site-packages\dill-0.2.2-py2.7.egg\dill\dill.py", line 278, in find_class
return StockUnpickler.find_class(self, module, name)
File "C:\Python27\Lib\pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named moduleA.moduleB.contact_geometry
我搜索了一下,发现 dill
的性能比 pickle
和 class 更好,但我在实现它时遇到了问题。我还发现我必须在文件 contact_geometry.py
.
ContactGeometry
中实现 __reduce__()
contact_geometry.py
class ContactGeometry(object):
def __init__(self, ...):
...
def __reduce__(self):
return (self.__class__, (os.path.realpath(__file__))
但是我不确定return这个方法应该是什么?我如何才能从当前情况成功加载 pickle 文件?
下面是项目结构,如果有帮助的话。
你不能运行一个python文件来自这样的包;它不会找到顶级包名称。我建议以下任何一项:
我是 dill
的作者。很难说出你是如何 运行 代码的,但看起来问题是你是 运行 代码和模块名称的一种方式,如@Antti Haapala 的回答。他的建议也很不错。
我会添加这个……您需要确保 (1) moduleA.moduleB.contact_geometry
在 PYTHONPATH
上,并且 (2) 您没有将模块转储为 __main__.moduleB.contact_geometry
并尝试将其加载为 moduleA.moduleB.contact_geometry
-- dill
将 __main__
视为一个模块(大部分情况下)。
但是,您不需要向 类 添加 __reduce__
方法。