web-dev-qa-db-fra.com

Python erreur: AttributeError: l'objet 'module' n'a pas d'attribut

Je suis totalement nouveau à Python et je sais que cette question a été posée plusieurs fois, mais malheureusement, il semble que ma situation soit un peu différente ... J'ai créé un package (ou alors je pense L'arborescence du catalogue est la suivante:

mydir
  lib     (__init__.py)
    mod1  (__init__.py, mod11.py)

Entre parenthèses, il y a des fichiers dans le catalogue. Les deux fichiers __init__.py Ont une longueur nulle. Le fichier mydir/lib/mod1/mod11.py Contient les éléments suivants:

def mod12():
    print "mod12"

Maintenant, je lance python, puis import lib, Ce qui fonctionne bien, puis lib.mod11() ou lib.mod12(). L'un des deux derniers me donne le message d'erreur sujet. En fait, dir(lib) après l'étape 2 n'affiche pas non plus mod11 Ou mod12. Il semble que je manque quelque chose de vraiment simple. (J'utilise Python 2.6 dans Ubuntu 10.10)

Merci

35
Alex

Lorsque vous import lib, Vous importez le package. Le seul fichier à évaluer et à exécuter dans ce cas est le 0 octet __init__.py Dans le répertoire lib.

Si vous voulez accéder à votre fonction, vous pouvez faire quelque chose comme ceci from lib.mod1 import mod1 Puis exécuter la fonction mod12 Comme si mod1.mod12().

Si vous souhaitez pouvoir accéder à mod1 Lorsque vous importez lib, vous devez placer un import mod1 Dans le fichier __init__.py À l'intérieur du lib répertoire.

32
Noufal Ibrahim

Plus précisément, vos répertoires mod1 Et lib ne sont pas des modules, ce sont des packages. Le fichier mod11.py Est un module.

Python n'importe pas automatiquement les sous-packages ou modules. Vous devez le faire explicitement, ou "tricher" en ajoutant des instructions d'importation dans les initialiseurs.

>>> import lib
>>> dir(lib)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import lib.pkg1
>>> import lib.pkg1.mod11
>>> lib.pkg1.mod11.mod12()
mod12

Une alternative consiste à utiliser la syntaxe from pour "extraire" un module d'un package dans votre espace de noms de scripts.

>>> from lib.pkg1 import mod11

Référencez ensuite la fonction simplement mod11.mod12().

23
Keith

La façon dont je le ferais est de laisser les fichiers __ init__.py vides, et de faire:

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

ou

from lib.mod1.mod11 import mod12
mod12()

Vous pouvez trouver que le répertoire mod1 n'est pas nécessaire, il suffit d'avoir mod12.py dans lib.

5
Gary van der Merwe

Ma solution est de mettre ces importations dans __init__.py de lib:

in file: __init__.py
import mod1

Ensuite,

import lib
lib.mod1

fonctionnerait bien.

4
Henry