2013-05-30 5 views
0

У меня есть приложение Python, который имеет следующую структуру каталогов:питона импорт пути столкновение

/home/vagrant/app 
/home/vagrant/app/support 
/home/vagrant/app/utils   (1) 
/home/vagrant/app/examples/example_a 
/home/vagrant/app/examples/utils  (2) 

Я добавил/дом/бродячий/приложение к моей PYTHONPATH и всем папкам имеют __init__.py файлов.

Я пытаюсь запустить приложение, вызвав /home/vagrant/app$ python ./example/example_a/ex_a.py

Он выходит с TRACEBACK:

File "./examples/example_a/ex_a.py", line 14, in <module>   (3) 
    from support.sp1.py import * 
File "/home/vagrant/app/support/sp1.py", line 11, in <module>  (4) 
    from utils.mod_a import * 
ImportError: No module named mod_a 

модуль с именем mod_a.py присутствует в ~/app/utils но не ~/app/examples/utils.

Я попытался переименовать ~/app/examples/utils в ~/app/examples/utils-ex. Это решает эту проблему, но другие вещи, которые полагаются на «/ home/vagrant/app/examples/utils», нарушены.

Есть ли способ заставить интерпретатор python искать utils (1), а не utils (2)? Файл (3) имеет относительный путь (префикс с точкой), а файл (4) имеет абсолютный путь (с префиксом /). Я думаю, что что-то не так с моей настройкой, что делает интерпретатор в папке приложений/примеров перед приложением /. Мой путь запуска находится в пути app/examples/example_a, но sp1.py - нет.

Конечно, было бы проще не иметь utils и examples/utils, но это не мой код, и я не хочу его переписывать.

ответ

0

я сдался и принял неизбежное решение на основе Bash:

cp -r ./examples/utils/ ./examples/xutils/ 
rm -R ./examples/utils/utils 
find ./ -type f -exec sed -i 's/examples.utils/examples.xutils/g' {} \; 
1

Необходимо сначала включить absolute imports.

from __future__ import absolute_import 
from utils.mod_a import foo, bar 
+0

Мне нравится идея, но, к сожалению, не получилось - потому что код зависит от относительных путей в ex_a.py. То, что мне было нужно, было относительно ex_a.py и абсолютным в sp1.py. – Terry

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