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