2014-01-29 5 views
3

Я структурирование мое приложение Python с помощью следующей архитектуры папок (примерно следующий контур here):Импорт из другой директории

myapp: 
    myapp_service1: 
     myapp_service1_start.py 
     ... 
    myapp_service2: 
     myapp_service2_start.py 
     ... 
    myapp_service3: 
     myapp_service3_start.py 
     ... 
    common: 
     myapp_common1.py 
     myapp_common2.py 
     myapp_common3.py 
     ... 
scripts: 
    script1.py 
    script2.py 
    script3.py 
    ... 
tests: 
    ... 
docs: 
    ... 
LICENSE.txt 
MANIFEST.in 
README 

Это идеальный вариант иерархии файлов/папок для меня, однако, я запутался о том, как для ссылки на модули из внешних папок. Например, myapp_service1_start.py должен ссылаться на функцию в myapp_common1.py и myapp_common2.py.

Я знаю, что мне нужно как-то добавить ссылку на систему path или pythonpath, но я не уверен, что лучший способ сделать это в коде. Вернее, если бы я сделал это в коде.

Как это сделать?

Я видел много сообщений о создании полного пакета Python, чтобы быть установлен через pip, но это кажется излишним для меня.

ответ

2

Один из способов состоит в том, чтобы каждый из ваших myapp_service*_start.py файлов добавлял myapp/ в каталог sys.path.

Например, падение файл с именем import_me.py в myapp_service1/ с кодом, который присоединяет к «один вверх» каталог (по отношению к импортирующей файл) в sys.path:

import os 
import sys 
import inspect 
this_dir = os.path.dirname(inspect.getfile(inspect.currentframe())) 
src_dir = os.path.join(this_dir, '..') 
sys.path.insert(0, src_dir) 

Тогда в вашем myapp_service1_start.py вы можете сделать что-то вроде :

import import_me 
from common import myapp_common1 
from common import myapp_common2 

конечно, не забудьте сделать common каталог пакета Python, понижая (возможно, пустой) __init__.py в него файл.

+0

Работает отлично !! – Brett

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