当我用泡菜和单品一起使用时,我犯了一个错误。
我写了3个程序文件:
实码分别如下。
#1. ClassToPickle.py
import pickle
class ClassToPickle(object):
def __init__(self, x):
self.x = x
if __name__=="__main__":
p = ClassToPickle(10)
pickle.dump(p, open('10.pickle', 'w'))
#2. SomeClass.py
from ClassToPickle import ClassToPickle
import pickle
class SomeClass(object):
def __init__(self):
self.pickle = pickle.load(open("10.pickle", 'r'))
self.x = self.pickle.x
print self.x
if __name__ == "__main__":
SomeClass()
#3. SomeClassTest.py
import unittest
from SomeClass import SomeClass
from ClassToPickle import ClassToPickle # REQUIRED_LINE
class SomeClassTest(unittest.TestCase):
def testA(self):
sc = SomeClass()
self.assertEqual(sc.x, 10)
def main():
unittest.main()
if __name__ == "__main__":
main()
我首先运行#1程序来制作泡菜文件。
然后,当我单独运行程序文件#2 (即输入"python SomeClass.py")时,它就能工作了。
而且,当我单独运行程序#3 (即输入"python SomeClassTest.py")时,它也能工作。
然而,当我在eclipse+pydev中以“单元测试”的形式运行程序#3时,它会在下面返回一个错误消息。
======================================================================
错误: testA (SomeClassTest.SomeClassTest)跟踪(最近一次调用):
$ File“/home/tmp/泡菜问题/SomeClassTest.py”,第9行,在testA中
sc = SomeClass()
$ File“/home/tmp/泡菜问题/SomeClass.py”,第8行,在init中
self.pickle =pickle.load(打开(“10.泡菜”,'r'))
$ File“/usr/lib/python2.7/泡菜. in”,第1378行,加载
返回Unpickler(文件).load()
$ File“/usr/lib/python2.7/泡菜. in”,第858行,装载
调度员
文件“/usr/lib/python2.7/泡菜. in”,第1090行,在load_global中
klass =self.find_class(模块,名称)
$ File“/usr/lib/python2.7/泡菜. in”,第1126行,find_class
klass = getattr(mod,name)
$ AttributeError:‘模块’对象没有属性'ClassToPickle‘在0.002 s失败(errors=1)中运行1测试
而且,当我注释掉导入ClassToPickle类的一行(程序#3中的第3行,并注释为"REQUIRED_LINE")时,它无法工作,并返回下面描述的错误消息。
E
======================================================================
错误:(main.SomeClassTest)跟踪(最近一次调用):
文件"SomeClassTest.py",第9行,testA
sc = SomeClass()
init中的“/home/tmp/泡菜问题/SomeClass.py”文件,第8行
self.pickle =pickle.load(打开(“10.泡菜”,'r'))
文件“/usr/lib/python2.7/泡菜. in”,第1378行,加载
返回Unpickler(文件).load()
文件“/usr/lib/python2.7/泡菜. in”,第858行,装载
调度员
文件“/usr/lib/python2.7/泡菜. in”,第1090行,在load_global中
klass =self.find_class(模块,名称)
文件“/usr/lib/python2.7/泡菜. in”,第1126行,在find_class中
klass = getattr(mod,name)
AttributeError:‘模块’对象没有属性'ClassToPickle‘在0.001s失败(errors=1)中运行1测试
我想问题是关于python中的命名空间,但我不知道到底发生了什么,我能做些什么来解决它。
我如何“以单元测试(在eclipse+pydev中)运行”#3程序正确,
并在没有导入ClassToPickle的行的命令行中运行#3程序?
请帮帮我。
发布于 2011-10-28 04:00:41
因为__main__.ClassToPickle != ClassToPickle.ClassToPickle
,把它想成这样:
当您在ClassToPickle脚本中对类实例进行腌制时,泡菜模块将对类的所有引用进行筛选,这意味着它将对定义类的模块名进行筛选,而且由于您执行了脚本ClassToPickle.py
,这意味着模块将被设置为__main__
,这意味着pickle
模块将对__main__.ClassToPickle
进行筛选。
当您试图加载已被腌制的实例时,它失败了,因为它没有找到实例的类,即__main__.ClassToPickle
,而不是使用from ClassToPickle import ClassToPickle
导入的类,因为最新的是ClassToPickle.ClassToPickle
。
修复方法是创建另一个处理转储的脚本,而不是在ClassToPickle.py
中执行。
import pickle
from ClassToPickle import ClassToPickle
if __name__=="__main__":
p = ClassToPickle(10)
pickle.dump(p, open('10.pickle', 'w'))
https://stackoverflow.com/questions/7928450
复制相似问题