python-import-Modul aus einem Paket
Ordner-Struktur:
<current dir>
main.py
packages <dir>
__init__.py
mod.py
main py:
import packages
print packages.mod.hello()
mod.py:
def hello():
return 'hello'
__init__.py:
from packages import mod
Wenn ich main.py
bekomme ich keine Fehler. Aber wenn ich Bearbeiten __init__.py
zu 'from packages import *'
, bekomme ich diesen Fehler: AttributeError: 'module' Objekt hat kein Attribut 'mod'
Ich bin nicht zu Fragen, wie zu machen, dass 'print'
- Befehl funktioniert. Ich kann die Verwendung anderer 'import'
syntax in main.py
machen, damit es funktioniert. Die Frage ist: ich bin neugierig, dass 'from packages import mod'
im __init__.py
. Wenn ich das tun kann import mod
wenn ich dann auf ersetzen, um import *
, was bedeutet, importieren Sie alles, warum bekomme ich eine Fehlermeldung statt?
Also, was bedeutet das from packages import *
wirklich bedeutet im inneren, dass __init__.py
?
Wer kann helfen? Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort
Also, was bedeutet das
from packages import *
wirklich bedeutet im inneren, dass__init__.py
?Den
__init__.py
Importe selbst.Erklärung
Können Sie nur die import-Module, nicht Pakete. Pakete sind nur Container für Module oder sub-Pakete. Wenn Sie "importieren" ein Paket, das Sie eigentlich das Modul importieren
__init__.py
.Den
__init__.py
mit diesem Inhalt:importiert das Modul
mod
in__init__.py
. Daher wird es verfügbar seinin Ihrem
main.py
überpackages.mod
(denken Sie daranpackages
wird vertreten durch__init__.py
).Wenn Sie ändern Sie den Inhalt
__init__.py
zu:Importieren Sie das Modul
__init__.py
, die sehr gleiche Datei, die Sie sind in.Dies funktioniert (ein zweiter import nur löst eine Suche in
sys.modules
)aber gibt dir nicht den Inhalt
mod
.Dies bedeutet, die Sie verwenden können:
aber Sie nicht vernünftig verwenden Sie diese mit einem leeren
__init__.py
:Weil
package
ist tatsächlich, vertreten durch die__init__.py
und esnichts in es noch nicht. Sie können dies überprüfen, (interaktiv oder in Datei):
In
__init__.py
können Sie schreiben:und dann in
main.py
:funktioniert. Da die Funktion
hello()
ist jetzt in den globalen Raum der Namen dieDatei
__init__.py
.Wie bereits in der Antwort von mozman, die Sie verwenden können
__all__
im__init__.py
zuListe der Module, die sollten importiert werden wenn
from packages import *
verwendet wird. Dies ist speziell für diesen Fall.Den
__init__.py
hat nur diesen Inhalt:Nun können Sie dies in
main.py
:Wenn Sie erweitern Ihre
__init__.py
:Können Sie dies tun, in
main.py
:Aber wenn Sie entfernen die
from packages import *
aus__init__.py
:Erhalten Sie eine Fehlermeldung:
weil die
__all__
ist nur für diefrom packages import *
Fall.Jetzt sind wir wieder zu den
__init__.py
Importe selbst.from package import *
da gibt es keine Fehler beim kompilieren, nur wenn ich drucken, dann hieß es kein Modul 'mod'. Also, dass der Befehl gültig ist , bin ich nur verwirrt über das, was der code tut .Siehe auch: In Python, was genau bedeutet "import *" importieren?
hinzufügen __alle__ Paketen.__init__:
sowie das Modul 'mod' importiert werden, sonst wird 'mod' ist nicht in den Namensraum von 'Pakete', aber ich kann nicht erklären, warum 'import *' ohne __alle__, nicht importieren 'mod'.
laden Sie die Module in das gleiche Pakete direkt. Der folgende code funktioniert und es lädt alle Module innerhalb von mod.py.
Innen __init__.py
Effiziente Einfuhr - lädt nur die Hallo-Funktion
In Ihrem code
from packages import *
Sie sagen, den Dolmetscher zu suchen, um ein Module innerhalb vonpackages
(im gleichen Verzeichnis wie__init__.py
). Aber es dort nicht gibt. Es existiert ein Verzeichnis über die__init__.py
. (Ich vermute meine Begriffe falsch sind)Hier ist ein Referenz, die erklärt, wie laden Sie das Paket mit sich selbst.
FAND ES
War es sehr interessant zu Lesen, über python-import-Mechanismen. Ref1 Ref2 Ref3
Offenbar die übergeordneten Module zuerst geladen wird. Zum Beispiel Ref3 besagt, dass der code
import mod
innen__init__.py
automatisch interpretiert alspackages.mod
. Jetzt muss ich herausfinden, was passiert, wenn Sie schreibenimport packages.mod
. Ref1 ist mehr up-to-date mit Python ist3 Konventionen. Finden Sie es für mehr info. Hoffe, dies hilft Ihnen.packages
als root-Ordner. Jetztfrom packages import mod
undfrom packages.mod import *
beide Werke. Aber laufen die_init__.py
innerhalb einer terminal wirftImportError: No module named 'packages'
. Dies ist bereits Thema in der Ref 1,2 und 3 im detail. Die Pakete, die nicht bekannt werden, bevor der import wird aufgerufen. Also, wenn wir versuchen, das laden von Paketen es sagtImportError
.