Подтвердить что ты не робот

Ошибка 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)

Спасибо

4b9b3361

Ответ 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

будет работать нормально.