Относительный путь не работает даже с __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 <Something...>
Есть что-то очевидное, чего мне не хватает?
Есть ли способ проверить, настроил ли я __init__.py
файлы правильно, или чтобы увидеть мою иерархию пакетов?
6 ответов
Вы должны обновить свой sys.path
, где Python ищет модули, а не путь вашей системы в текущей среде, что os.environ["PATH"]
имеет в виду.
Пример:
import os, sys
sys.path.insert(0, os.path.abspath(".."))
import aa
После этого вы можете использовать свои функции в aa
как это: aa.myfunc()
В принятом ответе для python есть еще информация: импортировать модуль из каталога
Каталог lib должен находиться в пути поиска модуля python, который не совпадает с путем поиска, используемым вашей оболочкой.
Это, вероятно, будет работать для вас:
import sys, os
sys.path.append(os.path.abspath(".."))
Однако, вероятно, лучше запускать ваш код из контекста, где пакет lib уже находится на пути. Например, из каталога 'proj'.
У меня были похожие проблемы, и вот мой совет.
Вместо смены sys.path
лучше запустите свой test.py из proj
(т. е. корневой каталог проекта). Таким образом, проект DIR будет автоматически sys.path
и вы сможете импортировать lib
пакет.
И использовать абсолютный импорт.
Где код, из которого вы пытаетесь импортировать lib.aa? Я предполагаю, что /proj/ не ваш рабочий каталог, и он должен быть таким, как сейчас. Вместо PATH вы хотели бы добавить свой каталог в PYTHONPATH, чтобы он появлялся в пути поиска для импорта. См. http://docs.python.org/tutorial/modules.html.
Кроме того, обратите внимание на http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html Настоятельно рекомендуется установить дополнительный уровень каталога, чтобы вместо lib.aa
, вы бы назвали это my_proj.lib.aa
,
Системная переменная PATH не используется оператором импорта python. Он использует PYTHONPATH, но лучший способ добавить новый каталог для импорта пути поиска - это изменить sys.path.
Если это не помогает, добавьте к вопросу свое значение sys.path и значение, возвращаемое os.getcwd().
В Sublime Text 3 это не сработало для меня. Я использую это вместо этого в верхнем файле «__ init __.py»
Надеюсь, это сработает для вас.
from os.path import dirname
from sys import path
path.insert( 0 , dirname( __file__ ) ) ;
from test import aa_test