python pickle上的名称空间
我将pickle与unittest一起使用时出错 我写了3个程序文件:python pickle上的名称空间,python,namespaces,pickle,Python,Namespaces,Pickle,我将pickle与unittest一起使用时出错 我写了3个程序文件: 对于一个需要腌制的班级 对于使用#1中的类的类 单元测试用于测试#2中的类 实际代码分别如下所示 #一,。ClassToPickle.py import pickle class ClassToPickle(object): def __init__(self, x): self.x = x if __name__=="__main__": p = ClassToPickle(10)
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'))
#二,。某个班级
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()
#三,。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程序来制作pickle文件。然后,当我单独运行程序文件#2(即输入“pythonsomeclass.py”)时,它就会工作。
而且,当我单独运行程序3(即输入“pythonsomeclasstest.py”)时,它也可以工作。
然而,当我在eclipse+pydev中以“单元测试”的形式运行程序#3时,它会返回下面的错误消息 ==================================================================================
错误:testA(SomeClassTest.SomeClassTest)
----------------------------------------------------------------------
回溯(最近的上次调用):
$File “/home/tmp/pickle_problem/SomeClassTest.py”,第9行,在 种皮
sc=SomeClass()
$File“/home/tmp/pickle\u problem/SomeClass.py”,第8行,在 init
self.pickle=pickle.load(打开(“10.pickle”,“r”))
$File“/usr/lib/python2.7/pickle.py”,第1378行,在load中
返回load中的第858行Unpickler(file.load()
$file”/usr/lib/python2.7/pickle.py dispatchkey
文件/usr/lib/python2.7/pickle.py”,第1090行,在load_global中
klass=self.find_类(模块,名称)
$File“/usr/lib/python2.7/pickle.py”,第1126行,在find_类中
klass=getattr(mod,name)
$AttributeError:“module”对象没有属性“ClassToPickle”
----------------------------------------------------------------------
在0.002s中运行了1次测试
失败(错误=1)
而且,当我注释掉导入ClassToPickle类的一行(program#3中的第3行并注释为“REQUIRED#line”)时,它不起作用,并返回下面描述的错误消息 E
==================================================================================
错误:testA(main.SomeClassTest)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
testA中第9行的文件“SomeClassTest.py”
sc=SomeClass()
文件“/home/tmp/pickle\u problem/SomeClass.py”,第8行,在init
self.pickle=pickle.load(打开(“10.pickle”,“r”))
文件“/usr/lib/python2.7/pickle.py”,第1378行,装入
返回Unpickler(file.load()
文件“/usr/lib/python2.7/pickle.py”,第858行,装入
dispatchkey
文件“/usr/lib/python2.7/pickle.py”,第1090行,在load_global中
klass=self.find_类(模块,名称)
文件“/usr/lib/python2.7/pickle.py”,第1126行,在find_类中
klass=getattr(mod,name)
AttributeError:“模块”对象没有属性“ClassToPickle”
----------------------------------------------------------------------
在0.001s内运行1次测试
失败(错误=1)
我想问题是关于python中的名称空间,但我不知道到底发生了什么,我能做些什么来解决它 我如何才能“作为单元测试运行(在eclipse+pydev中)”#3程序正确运行,
并在命令行中运行#3程序,而不使用导入ClassToPickle的行?
请帮帮我。那是因为
\uuu main\uuuu.ClassToPickle!=ClassToPickle.ClassToPickle
,请这样想:
当您在ClassToPickle.py
脚本中pickle ClassToPickle的类实例时,pickle模块将pickle对该类的所有引用,这意味着它将pickle定义该类的模块名称,因为您执行了脚本ClassToPickle.py
,这意味着模块将被设置为\uuuuuu main\uuuuu
,这意味着pickle
模块将pickle\uuuuuu main\uuuuuuuuu.ClassToPickle
当您尝试加载pickle实例时,它失败了,因为它没有找到实例的类,该类是\uuuu main\uuuuu.ClassToPickle
,而不是您使用从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'))
是否有另一个
ClassToPickle.py
文件可以找到,而不是您在此处显示的文件?@ThomasK谢谢您的评论,但答案是否定的。目录中只显示了三个.py文件,我从未创建名为ClassToPickle.py
的文件。谢谢您的解释!这一切对我来说都很有意义,而且您的脚本在控制台和eclipse中都可以运行:)@fbessho:很高兴它很有用:)