Ошибка Python: объект AttributeError: 'module' не имеет атрибута
Я абсолютно новичок в Python и знаю, что этот вопрос задавался много раз, но, к сожалению, похоже, что моя ситуация немного отличается...
Я создал пакет (или я так думаю). Дерево каталога выглядит следующим образом:
mydir
lib (__init__.py)
mod1 (__init__.py, mod11.py)
В скобках есть файлы в каталоге. Оба файла __init__.py
имеют нулевую длину.
Файл mydir/lib/mod1/mod11.py
содержит следующее:
def mod12():
print "mod12"
Теперь я запускаю python
, затем import lib
, который работает нормально, затем lib.mod11()
или lib.mod12()
.
Любой из последних двух дает мне сообщение об ошибке субъекта. На самом деле dir(lib)
после шага 2 также не отображает mod11
или mod12
.
Кажется, мне не хватает чего-то очень простого.
(Я использую Python 2.6 в Ubuntu 10.10)
Спасибо
Ответы
Ответ 1
Когда вы import lib
, вы импортируете пакет. Единственным файлом, который нужно оценить и запустить в этом случае, является 0 байт __init__.py
в каталоге lib.
Если вы хотите получить доступ к своей функции, вы можете сделать что-то вроде этого from lib.mod1 import mod1
, а затем запустить функцию mod12
, например, mod1.mod12()
.
Если вы хотите иметь доступ к mod1
при импорте lib
, вам нужно поместить import mod1
внутри файла __init__.py
в каталог lib
.
Ответ 2
Более точно, ваши каталоги mod1
и lib
не являются модулями, они являются пакетами. Файл mod11.py
является модулем.
Python автоматически не импортирует подпакеты или модули. Вы должны явно это сделать или "обмануть", добавив в инициализаторы инструкции импорта.
>>> import lib
>>> dir(lib)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import lib.pkg1
>>> import lib.pkg1.mod11
>>> lib.pkg1.mod11.mod12()
mod12
Альтернативой является использование синтаксиса from
для "вытягивания" модуля из пакета в пространство имен скриптов.
>>> from lib.pkg1 import mod11
Затем ссылку на функцию просто mod11.mod12()
.
Ответ 3
Как я могу это сделать, это оставить файлы __ init__.py пустыми и сделать:
import lib.mod1.mod11
lib.mod1.mod11.mod12()
или
from lib.mod1.mod11 import mod12
mod12()
Вы можете обнаружить, что директория mod1 не нужна, просто введите mod12.py в lib.
Ответ 4
Мое решение помещает эти импорты в __init__.py
из lib:
in file: __init__.py
import mod1
Тогда
import lib
lib.mod1
будет работать нормально.