Относительный путь не работает даже с __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
.
И используйте абсолютный импорт.