Python-fout: AttributeError: ‘Module’ object heeft geen attribuut

Ik ben helemaal nieuw in Python en ik weet dat deze vraag vele malen werd gesteld, maar helaas lijkt het erop dat mijn situatie een beetje anders is …
Ik heb een pakket gemaakt (of zo denk ik). De catalogusboom is als volgt:

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

Halverwege haakjes zijn er bestanden in de catalogus. Zowel __init__.pyBestanden zijn nul lengte.

Het bestand mydir/lib/mod1/mod11.pyBevat het volgende:

def mod12():
    print "mod12"

Nu, ik voer python, dan import lib, die OK werkt, dan lib.mod11()of lib.mod12().

Een van de laatste twee geeft mij het foutenmelding van de onderwerp. Eigenlijk dir(lib)NA STAP 2 Geeft niet mod11of mod12.
Het lijkt erop dat ik iets ergs eenvoudig mis.

(ik gebruik Python 2.6 in Ubuntu 10.10)

Bedankt


Antwoord 1, Autoriteit 100%

Wanneer u import libimporteert, importeert u het pakket. Het enige bestand dat in dit geval wordt geëvalueerd en uitgevoerd, is de 0 byte __init__.pyin de LIB-map.

Als u toegang tot uw functie wilt, kunt u zoiets doen als deze from lib.mod1 import mod1en vervolgens de mod12-functie uitvoeren zoals de mod1.mod12().

Als u toegang wilt krijgen tot mod1wanneer u import libimporteert, moet u een import mod1in de __init__.pyBestand in de map import lib.


Antwoord 2, Autoriteit 73%

Om precies te zijn, uw mod1en libmappen zijn geen modules, het zijn pakketten. Het bestand mod11.pyis een module.

Python importeert niet automatisch subpakketten of modules. Je moet het expliciet doen, of “cheat” door importstatements toe te voegen in de initializers.

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

Een alternatief is om de syntaxis fromte gebruiken om een module uit een pakket naar de naamruimte van uw script te “trekken”.

>>> from lib.pkg1 import mod11

Verwijs vervolgens naar de functie als eenvoudig mod11.mod12().


Antwoord 3, autoriteit 15%

De manier waarop ik het zou doen is om de __ init__.py-bestanden leeg te laten en het volgende te doen:

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

of

from lib.mod1.mod11 import mod12
mod12()

Misschien vindt u dat de mod1 dir niet nodig is, u hoeft alleen maar mod12.py in lib te hebben.


Antwoord 4, autoriteit 10%

Mijn oplossing is om die invoer in __init__.pyvan lib:

te plaatsen

in file: __init__.py
import mod1

Dan,

import lib
lib.mod1

zou prima werken.

Other episodes