Ошибка Python: AttributeError: у объекта 'module' нет атрибута - PullRequest
35 голосов
/ 02 февраля 2011

Я совершенно новичок в 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)

Спасибо

Ответы [ 4 ]

31 голосов
/ 02 февраля 2011

Когда вы import lib, вы импортируете пакет. Единственный файл, который будет оценен и запущен в этом случае - это 0 байт __init__.py в каталоге lib.

Если вам нужен доступ к вашей функции, вы можете сделать что-то вроде этого from lib.mod1 import mod1, а затем запустить функцию mod12, например, mod1.mod12().

Если вы хотите иметь доступ к mod1 при импорте lib, вам нужно поместить import mod1 в файл __init__.py в каталоге lib.

23 голосов
/ 02 февраля 2011

Точнее, ваши каталоги 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().

5 голосов
/ 02 февраля 2011

Я бы оставил пустыми файлы __ init__.py и сделал:

import lib.mod1.mod11
lib.mod1.mod11.mod12()

или

from lib.mod1.mod11 import mod12
mod12()

Вы можете обнаружить, что каталог mod1 не нужен, просто поместите mod12.py в lib.

4 голосов
/ 29 августа 2013

Мое решение состоит в том, чтобы импортировать эти данные в __init__.py из lib:

in file: __init__.py
import mod1

Тогда

import lib
lib.mod1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...