пространство имен на Python Pickle
Я получил ошибку, когда я использую рассол с unittest.
Я написал 3 программных файла:
для маринованного класса,для класса, который использует класс в # 1,unittest для тестирования класса # 2.и реальные коды являются следующими соответственно.
# 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"), она также работает.
Однако, когда я запускаю программу # 3 как «unit-test» в eclipse + pydev, она возвращает сообщение об ошибке ниже.
================================================== ====================
ОШИБКА: testA (SomeClassTest.SomeClassTest)
-------------------------------------------------- --------------------
Traceback (последний вызов был последним):
Файл $ "/home/tmp/pickle_problem/SomeClassTest.py", строка 9, в testA
sc = SomeClass ()
Файл $ /home/tmp/pickle_problem/SomeClass.py ", строка 8, вв этом
self.pickle = pickle.load (open ("10.pickle", 'r'))
Файл $ /usr/lib/python2.7/pickle.py, строка 1378, в загрузке
вернуть Unpickler (файл) .load ()
Файл $ /usr/lib/python2.7/pickle.py, строка 858, в загрузке
dispatchkey
Файл "/usr/lib/python2.7/pickle.py", строка 1090, в load_global
klass = self.find_class (модуль, имя)
Файл $ "/usr/lib/python2.7/pickle.py", строка 1126, в классе find_class
klass = getattr (мод, имя)
$ AttributeError: у объекта 'module' нет атрибута 'ClassToPickle'
-------------------------------------------------- --------------------
Пробежал 1 тест за 0.002 с
СБОЙ (ошибки = 1)
А также, когда я закомментировал строку, которая импортирует класс ClassToPickle (строка 3 в программе № 3 и закомментирована как «REQUIRED_LINE»), она не работает и возвращает сообщение об ошибке, описанное ниже.
E
================================================== ====================
ОШИБКА: testA (главный.SomeClassTest)
-------------------------------------------------- --------------------
Traceback (последний вызов был последним):
Файл "SomeClassTest.py", строка 9, в testA
sc = SomeClass ()
Файл "/home/tmp/pickle_problem/SomeClass.py", строка 8, вв этом
self.pickle = pickle.load (open ("10.pickle", 'r'))
Файл "/usr/lib/python2.7/pickle.py", строка 1378, в загрузке
вернуть Unpickler (файл) .load ()
Файл "/usr/lib/python2.7/pickle.py", строка 858, в загрузке
dispatchkey
Файл "/usr/lib/python2.7/pickle.py", строка 1090, в load_global
klass = self.find_class (модуль, имя)
Файл "/usr/lib/python2.7/pickle.py", строка 1126, в классе find_class
klass = getattr (мод, имя)
AttributeError: у объекта 'module' нет атрибута 'ClassToPickle'
-------------------------------------------------- --------------------
Пробежал 1 тест за 0.001с
СБОЙ (ошибки = 1)
Я предполагаю, что проблема заключается в пространстве имен в python, но я не знаю, что именно произошло, и что я могу сделать для его решения.
Как я могу "запустить как юнит-тест (в eclipse + pydev)" программу # 3 правильно,
и запустить программу # 3 в командной строке без строки, которая импортирует ClassToPickle?
Пожалуйста, помогите мне.