2013-02-15 2 views
0
packageName\ 
    __init__.py 
    src\ 
     __init__.py 
     someFile.py 
     classes\ 
      __init__.py 
      engine1.py 
      engine2.py 
      engine.py 
    tests\ 
     __init__.py 
     myTests.py 
    temp\ 

Я работаю над ООП с Python, и у меня есть несколько вопросов.Структурирование кода и модулей OOP Python

Я понимаю, что __init__.py определяет папку как модуль, но я не понимаю, насколько это приносит мне пользу.

Как я могу запустить myTests.py, если ему нужно импортировать класс из папки packageName/src/classes?

$ python packageName/tests/myTests.py 

Вышеупомянутый вызов - как я предполагаю, что намерен запустить свои тесты. Если структура такая, как я могу импортировать классы?

from ..src.classes.engine1 import * 
+1

Я настоятельно рекомендую вам прочитать [Руководство Автостопом Packaging 1.0 - Lay Out Your Project] (http://guide.python-distribute.org/quickstart .html # Компоновка-ваш-проект). Если вы структурируете проект как соответствующий пакет и установите его, вы сможете использовать абсолютный импорт из любой точки системы (например: 'from src.classes.engine1 import something'). Кроме того, я очень рекомендую вам избегать 'import *' операторов ... они могут загрязнять пространство имен вашего модуля и вызывать всевозможные необычные проблемы. – 2013-02-15 23:24:39

+1

Добавление файла '__init __. Py' в папку делает его _package_ других модулей (и/или подпакетов), а не самого модуля. – martineau

ответ

0

Как упомянуто в @Mike, руководство Hitchhiker по упаковке будет отличным местом для начала.

Теперь, насколько ваши тесты идут: по разным причинам вы не можете просто запустить python packageName/tests/myTests.py (в частности, Python запутается в макете пакета - при запуске файла с python foo.py ожидается, что он будет находиться вне пакет, поэтому линия from ..src … потерпит неудачу с Attempted relative import in non-package).

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

$ ls 
packageName/ run_tests 
$ cat run_tests.py 
from packageName.tests.myTests import main 
main() 

Затем введите main() в myTests().

Однако использование тестового бегуна намного проще. Если у Вас есть written your tests correctly, вы можете запустить их с:

$ ls 
packageName/ 
$ nosetests 
.................................. 
---------------------------------------------------------------------- 
Ran 34 tests in 1.440s 

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