Относительный путь не работает даже с __init__.py

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

У меня есть файловая структура, подобная этой

  proj/
       lib/
          __init__.py
          aa.py
          bb.py
          test/
               __init__.py
               aa_test.py

Я понял, что если я включу код в свой test.py

        import lib.aa

или

        from lib import aa

Я мог бы ссылаться на модули в каталоге lib/.

Это не сработало.

Итак, я попытался добавить путь, и он добавляет его правильно

    os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..",""))
    print os.environ["PATH"]

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

     ImportError: No module named aa

или

     ImportError: Importing from non-package <Somethig...>

Есть ли что-то очевидное, чего я не хватает? Есть ли способ проверить, правильно ли настроил мой init.py или посмотреть мою иерархию пакетов?

Ответ 1

Вам нужно обновить sys.path, где python ищет модули, в отличие от вашего системного пути в текущей среде, что означает os.environ["PATH"].

Пример:

import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa

После этого вы можете использовать свои функции в aa следующим образом: aa.myfunc()

В дополнительной информации в ответе для python: импортируйте модуль из каталога

p >

Ответ 2

Каталог lib должен находиться в вашем пути поиска модуля python, это не то же самое, что и путь поиска, используемый вашей оболочкой.

Это, вероятно, будет работать для вас:

import sys, os
sys.path.append(os.path.abspath(".."))

Однако, вероятно, лучше запустить свой код из контекста, где пакет lib уже находится на пути. Например, из каталога 'proj'.

Ответ 3

Где код, с которого вы пытаетесь импортировать lib.aa? Я предполагаю, что/proj/не является вашим рабочим каталогом, и он должен быть настроен прямо сейчас. Вместо PATH вы хотели бы добавить свой каталог в PYTHONPATH, чтобы он отображался в пути поиска для импорта. См. http://docs.python.org/tutorial/modules.html#the-module-search-path

Также, пожалуйста, взгляните на http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html. Настоятельно рекомендуется установить дополнительный уровень каталога вместо lib.aa, вы бы назвали его как my_proj.lib.aa.

Ответ 4

Переменная System PATH не используется оператором импорта python. Он использует PYTHONPATH, но лучший способ добавить новый каталог для импорта пути поиска - это изменить sys.path.

Если это не помогает, добавьте к вопросу свое значение sys.path и значение, возвращаемое os.getcwd().

Ответ 5

У меня были подобные проблемы, и вот мой совет.

Вместо изменения sys.path лучше запустить ваш test.py из каталога proj (т.е. проекта root). Таким образом, dir проекта будет автоматически находиться в sys.path, и вы сможете импортировать пакет lib.

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