Как мне заставить относительный импорт работать в Python, используя Eclipse с PyDev?

#python #eclipse #svn #pydev

#python #eclipse #svn #pydev

Вопрос:

Итак, я работаю над проектом Python, который был здесь до меня в репозитории SVN. Когда я впервые вытащил его, структура была немного странной из-за того, что она была похожа на:

 Proj
    src
    tags
    trunk
  

И тогда все находится внутри src являются ли файлы модуля python, кроме src , просто логической папкой без общего пакета внутри. Нет __init__.py в проекте где угодно. Поэтому я хочу реструктурировать его, по крайней мере, чтобы я мог использовать относительный импорт в своем проекте. Я также хочу настроить его так, чтобы он выглядел примерно так.

 Proj
    src
        model
        controller
        view
        test
    tags
    trunk
  

Тем не менее, я попытался настроить это, и независимо от того, что я, кажется, делаю, он не может разрешить относительный импорт в тот момент, когда мне нужно просмотреть пакеты. Я поместил __init__.py файл в пакете каждого уровня, включая один внутри папки src , причем все они имеют __all__ определенные. Однако, когда я пытаюсь выполнить модульный тест в моем test package и выполнить импорт, говоря:

 from ..model.foo import Foo
  

чтобы попытаться импортировать класс Foo из module foo.py расположенная внутри пакета модели, она не разрешается. На всякий случай, если это была проблема конкретно с модульными тестами, я также попробовал это с модулем в пакете контроллера, который зависел от класса в пакете модели, и наоборот. Ни один из них не работал. Как мне решить эту проблему?

Комментарии:

1. Когда вы говорите, что это не разрешается, вы имеете в виду, что у вас ошибка при запуске модуля или у вас ошибка в PyDev?

2. Я предполагаю, что прямо сейчас это ошибка при запуске модуля, но я не хотел исключать возможность того, что, возможно, это какая-то проблема с конфигурацией PyDev.

3. Можете ли вы опубликовать возникшее у вас исключение?

Ответ №1:

Вы добавили корневую папку в свой системный путь?

 import sys
sys.path.append(<place the Proj dir here>)
  

затем вы можете импортировать следующим образом:

 from src.model.somefile import Something
  

Если вы не знаете абсолютный путь для Proj, вы всегда можете использовать такие комбинации, как

 os.path.dirname(os.getcwd())
  

Комментарии:

1. Я думаю, вы имеете в виду os.getcwd()