относительный путь не работает даже с __init__.py - PullRequest
14 голосов
/ 24 февраля 2012

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

У меня есть такая файловая структура

  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файлы правильно, или чтобы увидеть мою иерархию пакетов?

Ответы [ 5 ]

17 голосов
/ 24 февраля 2012

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

Пример:

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

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

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

2 голосов
/ 24 февраля 2012

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

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

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

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

1 голос
/ 24 февраля 2012

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

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

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

1 голос
/ 24 февраля 2012

Где находится код, из которого вы пытаетесь импортировать 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 голосов
/ 24 февраля 2012

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

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

...