2015-07-18 2 views
0

У меня есть исходный код питона и UnitTest структуры коды в следующей иерархии:питон UnitTest неудачи с относительным импортом в исходном коде

bin/ 
    module1.py 
    module2.py 
    module3.py 
test/ 
    module1_test.py 

Код в модулях заключаются в следующем: module1.py

from module2 import testMethod1, testMethod2 
def testMethodY(): 
    ... 
    ... 
    ... 

module2.py

from module3 import testMethod4 

module3.py

def testMethod4(): 

module1_test.py

import unittest 
import sys, os 
path = os.path.dirname(__file__) 
path = os.path.join(path, 'bin') 
sys.path.append("/bin") 
from module1 import testMethodY 

...(Some code for unit test) 

когда я бегу питона module1_test.py он терпит неудачу с ошибкой импорта:

ImportError: cannot import name testMethod4 

Не уверен, что это неправильно. Если я запускаю исходный код, то все импортные работы работают нормально. Но с python unittest эти относительные импортные сбои. Может кто-нибудь сказать мне, какую ошибку я делаю.

+0

Можете ли вы рассказать о структуре, как, где находится «bin» и другие каналы? – kumar

+0

bin и test находятся в одном и том же каталоге/usr/lib/ – Sandy

+1

Sandy - я думаю, вам нужно очистить свой пример. Где-то вы делаете простую опечатку, которая, вероятно, вызывает вашу проблему, но ошибок слишком много. Например, 'из модуля 1' (у вас не может быть места там. Кроме того, вы ссылаетесь на' testMethodY', но в вашем исключении упоминается 'testMethod4'. Попробуйте упростить это до наименьшего воспроизводимого примера. – user590028

ответ

3

Создать __init__.py модуль в папке тестов и добавьте к нему следующий:

import sys, os 
path = os.path.dirname(__file__) 
path = os.path.join(path, 'bin') 
if path not in sys.path: 
    sys.path.append(path) 
+0

Я уже добавил выше код в моем module1_test.py, но это не сработает. Не уверен, какую ошибку я сделал. – Sandy

+0

Когда вы говорите, что это не сработало - что случилось? Если вы получаете сообщение об ошибке, опубликуйте это в описании проблемы. Рецепт, который я поделился, отлично работает в десятках проектов, которыми мы управляем. – user590028

+0

Я упомянул об ошибке выше: ImportError: невозможно импортировать имя testMethod4 – Sandy

2

Я думаю, что ваш path Append утверждение неверно. Вы добавляете /bin, который будет искать bin в корне диска.

sys.path.append("/usr/lib/bin")

+0

Я изменил его, как показано ниже: import sys, os path = os.path.dirname (__ file__) path = os.path.join (path, 'bin') и все тот же выпуск. Обязательно ли в каталоге bin должно быть __init__.py? мы не можем импортировать файл из пакета, если он не имеет __init__.py? – Sandy

+0

Да, если вы хотите, чтобы ваш каталог был признан пакетом, вам нужно '__init __. Py', как сказано ниже. – kumar

0

Проблема была из другого модуля с тем же именем из питона LIBS. Я переименовал его и решил проблему. Еще один подход, который помог установить модуль в PYTHONPATH.

Смежные вопросы