2013-05-07 2 views
0

Я настраиваю код для unittesting. Мой каталог в настоящее время выглядит следующим образом:Использование кода в init.py при запуске python из командной строки

project/ 
    src/ 
     __init__.py 
     sources.py 
    test/ 
     __init__.py 
     sources_test.py 

В __init__.py для каталога тест, у меня есть эти две линии:

import sys 
sys.path.insert(0, '../') 

В тестовых файлах, у меня есть строка import src.sources.

Когда я использую nose для запуска этих тестов из каталога проекта, все работает отлично. Если я пытаюсь запустить тесты по отдельности дает мне эту ошибку:

ImportError: No module named src.sources 

я предполагаю, что это происходит потому, что, когда я запустить тест из командной строки он не использует __init__.py. Есть ли способ, которым я могу убедиться, что он будет использовать эти строки, даже когда я пытаюсь выполнить тесты индивидуально?

Я мог взять строки из __init__.py и поместить их в свои тестовые файлы, но я стараюсь избегать этого.

Для выполнения тестов по отдельности я бегу python sources_test.py

+1

Как вы проводите тесты «индивидуально»? Какой файл вы используете для этого? – BrenBarn

+0

Я не использую файл. У файлов есть основные методы в них –

+0

Вы работаете в Python 2.x, или 3.x? В 2.x вы в принципе не можете делать то, что хотите делать так, как хотите. Но есть некоторые очевидные обходные пути: например, просто не попадайте в каталог 'test'. – abarnert

ответ

1

Вы действительно пытаетесь злоупотреблять пакетами здесь, и это не очень хорошая идея.

Простым решением является не запускать тесты из каталога tests. Просто поднимите уровень, затем сделайте python tests/sources_test.py.

Конечно, это само по себе не собирается импортировать test/__init__.py. Для этого вам действительно нужно импортировать пакет. Таким образом, python -m tests.sources_test, вероятно, является лучшей идеей ... кроме того, конечно, что если ваш пакет создан для запуска как сценарий, но не для импорта, это не сработает.

В качестве альтернативы вы могли бы (на платформах POSIX, как минимум) сделать PYTHONPATH=.. python sources_test.py с точностью до tests. Это немного хаки, но это должно сработать.

Или, лучше, соедините вышеуказанные и, с внешней стороны tests, сделайте PYTHONPATH=. python tests/sources_test.py.

Настоящим хакерским обходным путем является явно import __init__. Это должно в основном работать для вас простое использование, но все заканчивается неправильно - в частности, вы получаете модуль с именем __init__ вместо одного имени test, и, конечно, ваш основной модуль не называется test.sources_test, а на самом деле есть нет test упаковка вообще.Если вы случайно не импортируете что-либо после изменения sys.path, в этом случае вы можете получить дубликаты модулей.

+0

Я попытался запустить его извне каталога тестов, но он все еще не работает. Если бы мы могли получить эту работу, это было бы достаточно хорошим решением. –

+0

«Я пробовал ... но это не сработало» ничего не помогает. Измените свой вопрос, чтобы показать, что вы пробовали, и что он сделал неправильно. – abarnert

+0

Выполнение 'python tests/sources_test.py', как вы предложили, дает мне ту же ошибку импорта. –

0

Если вы пишете

import src.source 

интерпретатор питона смотрит в каталог Src для __init__.py файла. Если он существует, вы можете использовать каталог как имя пакета. Если ваш каталог не находится в каталоге проекта, который находится в каталоге src, тогда python просматривает каталоги в переменной окружения $PYTHONPATH (по крайней мере, в Linux, окна также должны иметь некоторую переменную среды, возможно, с другим именем) , если он может найти какой-то каталог src с файлом __init__.py. Вы установили $PYTHONPATH?

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