Python — как использовать PYTHONPATH со сложной структурой каталогов?

Рассмотрим следующую структуру файлов\каталогов:

project\
|  django_project\
|  |  __init__.py
|  |  django_app1\
|  |  |  __init__.py
|  |  |  utils\
|  |  |  |  __init__.py
|  |  |  |  bar1.py
|  |  |  |  ...
|  |  |  ...
|  |  django_app2\
|  |  |  __init__.py
|  |  |  bar2.py
|  |  |  ...
|  |  ...
|  scripts\
|  |  __init__.py
|  |  foo.py
|  |  ...

Как мне использовать sys.path.append в foo.py, чтобы я мог использовать bar1.py и bar2.py< /strong>?
Как будет выглядеть импорт?


person Jonathan    schedule 14.07.2010    source источник


Ответы (2)


Использование относительных путей было бы более желательным из соображений переносимости.

В верхней части вашего foo.py скрипта добавьте следующее:

import os, sys
PROJECT_ROOT = os.path.join(os.path.realpath(os.path.dirname(__file__)), os.pardir)
sys.path.append(PROJECT_ROOT)

# Now you can import from the django_project package
from django_project.django_app1.utils import bar1
from django_project.django_app2 import bar2
person Sam Dolan    schedule 14.07.2010

import sys
sys.path.append('/absolute/whatever/project/django_project/django_app1')
sys.path.append('/absolute/whatever/project/django_project/django_app2')

Хотя вам нужно оценить, хотите ли вы иметь оба на своем пути - в случае, если в обоих есть конкурирующие имена модулей. Возможно, имеет смысл иметь на вашем пути только django_project и вызывать django_app1/bar1.py, когда вам это нужно, и import django_app2.bar2.whatever, когда вам это нужно.

person eruciform    schedule 14.07.2010