2015-02-25 3 views
0

У меня возникли проблемы с импортом модулей Python из папки проекта в папку test. Конечно, я что-то пропустил, но, прочитав много других ответов, я до сих пор не могу заставить его работать.Импорт классов Python (проблемы __init__.py)

Структура папок выглядит следующим образом:

/CorpusBuilder 
    /corpusBuilder 
     __init__.py 
     corpus.py # contains Corpus class 
    /tests 
     __init__.py 
     test_corpus.py # trying to import Corpus class — but fails 

именно то, что должно быть содержание каждого __init__.py файла? [Требуется ли файл верхнего уровня (CorpusBuilder) __init__.py?] Что должно делать заявление import в test_corpus.py?

Извините за так много вопросов: Я думаю, что мне просто нужен ясный пример для работы.

+0

С точки зрения получения проекта, см., Например, http://www.jeffknupp.com/blog/2013/08/16/open-sourcing-a-python-project-the-right-way/ – jonrsharpe

ответ

0

Не нужно ничего вносить в файлы __init__.py. Предполагая, что вы запускаете свои тесты из базового каталога «CorpusBuilder» или иначе разместите этот каталог на PYTHONPATH, ваш файл test_corpus может просто сказать from corpusBuilder.corpus import Corpus.

+0

Из базы 'CorpusBuilder', я запускаю '$ python test/test_corpus.py' (который содержит 'from corpusBuilder.corpus import Corpus') и по-прежнему получает ту же ошибку. Мне также нужно добавить каталог в PYTHONPATH? – user2672537

+0

Я также попытался добавить файл '__init __. Py' в базу« CorpusBuilder ». Я просто получаю сообщение об ошибке «ИмпортError: Нет модуля с именем corpusBuilder.corpus' – user2672537

0

В моем подходе (по данным http://www.scotttorborg.com/python-packaging/index.html) тесты не находятся на верхнем уровне. И нет необходимости в файле инициализации. (при условии, что имя вашего модуля будет corpusBuilder). Что вам нужно это setup.py (опять: http://www.scotttorborg.com/python-packaging/minimal.html и https://docs.python.org/2/distutils/setupscript.html), если вы хотите запустить тесты вам с:

$ python setup.py test 

так что ваша структура должна быть:

CorpusBuilder/ 
    corpusBuilder/ 
     corpus.py 
     __init__.py 
     tests/ 
      __init__.py 
      test_corpus.py 
    setup.py 
    ... 

в INIT corpusBuilder, тогда вы сможете определить импорт из подмодулей. Это полезно, чтобы не загрязнять пространство имен. Например:

from .submodule import foo 

В противном случае это всего лишь пустой файл.

Файл инициализации в

tests/ 

ничего не нужно вообще, и в вашем test_corpus вам необходимо импортировать модуль. Например:

from unittest import TestCase 

import corpusBuilder 

class TestOne(TestCase): 
    def test_ist_string(self): 
     s = minimal.test() 
     self.assertTrue(isinstance(s, basestring)) 

Вы должны быть в состоянии выполнить свои тесты сейчас.

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