Относительный путь не работает даже с __init__.py
8 samirahmed [2012-02-24 10:35:00]
Я знаю, что существует множество подобных вопросов при переполнении стека. Но общий ответ, похоже, не работает для меня.
У меня есть файловая структура, подобная этой
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 или посмотреть мою иерархию пакетов?
python import package importerror
5 ответов
11 Решение Caspar [2012-02-24 10:49:00]
Вам нужно обновить sys.path
, где python ищет модули, в отличие от вашего системного пути в текущей среде, что означает os.environ["PATH"]
.
Пример:
import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa
После этого вы можете использовать свои функции в aa
следующим образом: aa.myfunc()
В дополнительной информации в ответе для python: импортируйте модуль из каталога
p >2 Matimus [2012-02-24 10:46:00]
Каталог lib должен находиться в вашем пути поиска модуля python, это не то же самое, что и путь поиска, используемый вашей оболочкой.
Это, вероятно, будет работать для вас:
import sys, os
sys.path.append(os.path.abspath(".."))
Однако, вероятно, лучше запустить свой код из контекста, где пакет lib уже находится на пути. Например, из каталога 'proj'.
1 gfortune [2012-02-24 10:47:00]
Где код, с которого вы пытаетесь импортировать 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
.
0 Scorpil [2012-02-24 10:53:00]
Переменная System PATH не используется оператором импорта python. Он использует PYTHONPATH, но лучший способ добавить новый каталог для импорта пути поиска - это изменить sys.path.
Если это не помогает, добавьте к вопросу свое значение sys.path и значение, возвращаемое os.getcwd().
0 warvariuc [2012-02-24 12:18:00]
У меня были подобные проблемы, и вот мой совет.
Вместо изменения sys.path
лучше запустить ваш test.py из каталога proj
(т.е. проекта root). Таким образом, dir проекта будет автоматически находиться в sys.path
, и вы сможете импортировать пакет lib
.
И используйте абсолютный импорт.