2013-08-18 3 views
1

Я рассмотрел the Python 2.7.5 documentation. У меня проблемы с моим реальным проектом, но здесь был создан небольшой тестовый проект, чтобы кратко воспроизвести проблему. Представьте себе пакет со следующей планировкой хранящегося в ~/развития/TestСмущает насчет импорта питона

Вот структура:

Test/ 
    __init__.py 
    foo.py 
    sub/ 
     __init__.py 
     test_foo.py 

И код (__init__.py файлы Empy):

foo.py

def bar(): 
    print("hello world") 

test_foo.py

import Test.foo 
# also tried from Test import foo 

def main(): 
    foo.bar() 

if __name__ == "__main__": 
    main() 

При попытке запустить test_foo.py с терминала (т. python test_foo.py) Я получаю:

Traceback (most recent call last): 
    File "test_foo.py", line 1, in <module> 
    import Test.foo 
ImportError: No module named Test.foo 

Я пытаюсь импортировать главный файл в пакете (foo.py) из тестового файла в модуле к югу (в моем реальном проекте модуль саба блок тестовый код). Как ни странно, используя редактор Sublime text 2 и плагин python test runner, я могу выполнить отдельные тесты просто отлично, но я не могу создать тестовый файл. Это дает мне ошибку выше.

+0

В вашем сообщении об ошибке: 'import foo', в вашем файловом коде указано' import test.foo' –

+0

@kroolik. Это была ошибка, следует сказать: Test.foo, я исправил его. – Matt

+0

Вам не следует создавать и запускать скрипты, размещенные внутри вашего модуля. Скрипты должны всегда находиться вне модуля. –

ответ

1

Имена модулей чувствительны к регистру. Использование: (. as foo так, что вы можете вызвать foo.bar в main)

import Test.foo as foo 


Вы также должны быть перечислены в ~/Development PYTHONPATH.

При использовании Unix и ваш Логин оболочки Баш, чтобы добавить ~/Development в PYTHONPATH редактировать ~/.profile включить

export PYTHONPATH=$PYTHONPATH:$HOME/Development 

Вот instructions for Windows.


Дальнейшие предложения для отладки:

Место

import sys 
print(sys.path) 
import Test 
print(Test) 
import Test.foo 

в верхней части test_foo.py. Пожалуйста, опубликуйте результат.

+0

Я изменил случай (тот же вопрос). Также используется условие 'как foo', и это не помогло решить проблему:« Traceback (последний последний вызов): Файл «test_foo.py», строка 1, в import Test.foo as foo ImportError : Нет модуля с именем Test.foo' – Matt

+0

Похоже, что '~/Development' не указан в переменной среды PYTHONPATH. Вы должны добавить этот каталог, чтобы Python знал, где искать импорт 'Test'. – unutbu

+0

Я нахожусь в Linux и добавил ваш обновленный ответ на мой '~/.profile', но он все еще не работает даже после перезагрузки bash (т. Е.' $. ~/.profile'). Тем не менее, когда я перемещаю test_foo.py вне модуля 'Test' (в ~/Development), он теперь работает (если я перемещаю его на один уровень до ~ /, это не так). – Matt

1

Бегущие скрипты всегда должны быть установлены за пределы модуля.Так что если у вас есть модуль и скрипт, который запускает некоторый код из этого модуля, структура должна выглядеть следующим образом:

foo/ 
    __init__.py 
    bar.py 
your_script.py 

И код в your_script.py должно быть что-то вроде:

from foo.bar import your_func 

your_func() 

В случае модульное тестирование его является хорошей идеей (это упрямый, и каждый имеет свой способ делать вещи), чтобы поместить тесты внутри модуля, так что структура должна выглядеть следующим образом:

foo/ 
    __init__.py 
    bar.py 
    tests/ 
     test_bar.py 

Но в этом случае вы не должны запускать скрипт напрямую. Вы должны либо использовать одну из основ тестирования как nose и запуск:

nosetests foo 

в директории, где вы разместили свой foo модуль.

Или, если вы использовали стандартную unittest библиотеку, создать TestSuite и что нет, запустите его:

python -m unittest foo.tests.test_bar 

снова в директории, где вы разместили свой модуль Foo.

+0

Спасибо, Виктор. Я использую 'нос. 'Я просто добавил' if __name__ == "__main __": 'part to' test_foo.py' просто для воспроизведения ImportError, в моем фактическом тестовом файле этого нет. Это мой первый крупный проект python s o лучшее понимание того, как структурировать каталоги, файлы и исполняемые сценарии действительно полезно. Благодарю. – Matt

+0

Если вы используете нос, то созданный вами макет правильный, вам просто нужно запустить скрипт 'nosetests' извне проекта, в том же каталоге, где находится ваша папка' Test', и запустить его с помощью 'nosetests ' Test', или что бы вы ни хотели проверить, «нос» довольно гибкий. –