2014-03-05 2 views
0

Я хочу эту структуру:Как настроить Python пакеты

Zimp/контроллер/game_play -> Как я: импорт Zimp/модель/модуль game_play самым простым способом? Zimp/model/game_play

Я создал папку под названием controller и папку под названием model. В этих папках я помещаю пустой файл __init__.py (не знаю, почему это что-то сделало). Я не создал файл model.py или файл controller.py. Это не сработало. Я просто сделал model.py и control.py, которые пусты, за исключением основного блока, который автоматически появляется при создании нового модуля. Нет разницы.

В контроллере/game_play.py Я пробовал: from ..model import game_play_model

Это говорит об ошибке Значения: попытка относительного импорт в не-пакете

ли идея не на самом деле положить их в отдельных каталогах? Какая норма?

Благодаря

ответ

1

Проблема заключается в том, что вы пытаетесь выполнить модуль подпакет напрямую, см. Ответы на вопрос Attempted relative import in non-package even with __init__.py.

Сначала я думаю, что вам нужно настроить структуру файлов каталога, как это:

Zimp/      top-level package 
    __init__.py     package initalization 
    controller/      subpackage 
     __init__.py      subpackage initalization 
     game_play.py     subpackage module 
    model/       subpackage 
     __init__.py      subpackage initalization 
     game_play_model.py    subpackage module 

В __init__.py файлы могут все быть пустым, поскольку они просто показывают, что каталог является [суб] пакет.
Для наглядности скажем, файл game_play_model.py содержал:

print 'hello from game_play_model.py' 

и файл game_play.py содержит следующее для обнаружения, когда она выполняется непосредственно и добавляет имя родителя его папки — Zimp — в Python путь поиска —, позволяющий затем напрямую импортировать другие вещи из пакета, когда он запускается таким образом.

if __name__ == '__main__' and __package__ is None: 
    import sys, os.path as path 
    # append parent of the directory the current file is in 
    sys.path.append(path.dirname(path.dirname(__file__))) 

import model.game_play_model 

print 'hello from game_play.py' 

И ты выполнил его непосредственно с чем-то вроде python game_play.py он выведет:

hello from game_play_model.py 
hello from game_play.py 
+0

Спасибо. У меня есть эта структура файла и код, но он все равно не распознает модуль с именем model.game_play_model. В моей папке zimp также есть папка _pycache__, если это делает разница. Я выполнил ваше заявление, если слово слово.Не уверен, что я должен был это сделать. – user3164083

+0

Подождите, я переместил if на верх, я думаю, это сработало. – user3164083

+1

Операция 'if' и' sys.path.append() 'должны появляться перед оператором' import'. – martineau

0
from Zimp.model import game_play 

Если сделать трюк.

+0

Спасибо. У меня нет модуля под названием Zimp.model. Я только сделал Zimp как папку. Так что я должен создать новый модуль с именем zimp. И внутри это то, что я должен писать? Спасибо!! – user3164083

+0

Я думаю, что было бы лучше, если бы вы прочитали, как работают модули Python: http://docs.python.org/2/tutorial/modules.html – Ruben

+0

Спасибо, я уже это прочитал. Он не говорит, как создать структуру. Только как работать с ним, как только это будет сделано. – user3164083

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