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__.py
Bestanden zijn nul lengte.
Het bestand mydir/lib/mod1/mod11.py
Bevat 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 mod11
of 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 lib
importeert, importeert u het pakket. Het enige bestand dat in dit geval wordt geëvalueerd en uitgevoerd, is de 0 byte __init__.py
in de LIB-map.
Als u toegang tot uw functie wilt, kunt u zoiets doen als deze from lib.mod1 import mod1
en vervolgens de mod12
-functie uitvoeren zoals de mod1.mod12()
.
Als u toegang wilt krijgen tot mod1
wanneer u import lib
importeert, moet u een import mod1
in de __init__.py
Bestand in de map import lib
.
Antwoord 2, Autoriteit 73%
Om precies te zijn, uw mod1
en lib
mappen zijn geen modules, het zijn pakketten. Het bestand mod11.py
is 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 from
te 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__.py
van lib:
te plaatsen
in file: __init__.py
import mod1
Dan,
import lib
lib.mod1
zou prima werken.