Структурируйте проект на Python с двумя различными приложениями - PullRequest
2 голосов
/ 28 сентября 2011

Я планирую написать киоск для посетителей на python / GTK.В проекте будет два приложения: внешний интерфейс для киоска и внутренний для управления, связанные с БД MySQL.

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

project.common - для общего кода

project.frontend - для внешнего интерфейса.

project.backend - для внутреннего интерфейса.

Итак:

project/
    common
    frontend
    backend

Проблема, с которой я столкнусь, состоит в том, что у каждого приложения будут свои собственные data_files, и я хочу, чтобы приложения были упакованы отдельно.Внешний интерфейс будет работать только в Linux, а внутренний - в Windows (cx_freeze) и Linux.

Кто-нибудь может дать мне какой-нибудь совет?

1 Ответ

2 голосов
/ 28 сентября 2011

Вы можете иметь несколько каталогов (то есть каталогов common/project, frontend/project и backend/project) в вашем PYTHONPATH с перекрывающимися иерархиями (т.е. каждый имеет project пакет верхнего уровня), но по умолчанию Python не будет будьте довольны этим, потому что он использует каталог first , который находит, и не ищет все из них, как это делают многие другие языки (PHP, Java и т. д.), поэтому вы получите ошибки импорта.

Однако, поместив это в каждый project/ каталог __init__.py, вы фактически указываете Python продолжать искать, и это не единственное место, где можно найти код для этого пакета:

import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)

Многие питонисты будут избегать и издеваться над вами за такую ​​нелепую аберрацию и заявлять о глупости этого усилия и, возможно, делать неприятные предположения о вашем происхождении приматов. «Пакеты пространств имен - ужасная идея», - скажут они. Приготовьтесь защищать свое решение. И не смей добавлять эти две строки в дерево исходных текстов без сопровождающих комментариев, объясняющих, что они делают!

На этой странице есть хорошее объяснение некоторых из этих понятий: Объяснение: http://www.doughellmann.com/PyMOTW/pkgutil/

Если вы придерживаетесь этого подхода, вы можете создать дистрибутив с помощью common + frontend, а другой с common + backend.

...