Python-Submodul Importe mit __init__.py
Lerne ich Python, und ich kann nicht herausfinden, wie die Importe in __init__.py
Arbeit.
Ich verstehe von das Python-tutorial, dass die __init__.py
Datei initialisiert ein Paket, und das kann ich importieren Unterpakete hier.
Mache ich etwas falsch, obwohl. Können Sie uns erklären, für mich (und für zukünftige Python-Lernende) was mache ich falsch?
Hier ist ein Vereinfachtes Beispiel, was ich versuche zu tun.
Dies ist meine Dateistruktur:
package
__init__.py
test.py
subpackage
__init__.py
hello_world.py
Den Inhalt hello_world.py
:
def do_something():
print "Hello, world!"
subpackage/__init__.py
leer ist.
package/__init__.py
enthält:
import test.submodule.do_something
Und schließlich test.py
enthält:
do_something()
Dies ist, wie ich versuchen zu laufen hello_world.py mit OSX terminal und Python 3:
python test.py
Python wirft dann folgenden Fehler:
NameError: name 'do_something' is not defined
- Ich nehme an, der
test.py
Sie ausführen, istpackage/test.py
? Wenn ja, gibt es keine Notwendigkeit, dass ich sehen kann, um es in eine Paket, und sopackage/__init__.py
würde zu sein scheinen völlig irrelevant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie wahrscheinlich bereits wissen, dass beim import eine Modul, der interpreter erzeugt einen neuen namespace und führt den code des Moduls mit den neuen namespace als den lokalen als auch den globalen Namensraum. Wenn die code-Ausführung abgeschlossen ist, wird der Modul-name (oder der name in jedem
as
- Klausel) gebunden ist, das Modul-Objekt nur innerhalb erstellt der Import namespace aufgezeichnet und gegen seine__name__
imsys.modules
.Wenn ein Qualifizierter name wie
package.subpackage.module
importiert wird der erste name (package
) werden in den lokalen Namensraum, dannsubpackage
Import inpackage
's namespace und schließlichmodule
Import inpackage.subpackage
's namespace. Importe mitfrom ... import ... as ...
führen die gleiche Abfolge von Operationen, aber die importierten Objekte gebunden sind, die direkt auf die Namen in der Import module namespace. Die Tatsache, dass der name des Pakets ist nicht verpflichtet, in Ihren lokalen Namensraum muss nicht bedeuten, dass es noch nicht importiert wurde (wie Inspektionsys.modules
wird sich zeigen).Den
__init__.py
in einem Paket serviert viel die gleiche Funktion wie ein Modul.py
- Datei. Ein Paket, mit Struktur, ist geschrieben wie ein Verzeichnis, das kann auch enthalten Module (regelmäßige.py
- Dateien) und Verzeichnisse (auch mit einem__init__.py
- Datei) für jede sub_packages. Wenn das Paket importiert wird ein neuer Namensraum erzeugt und das Paket ist__init__.py
ist ausgeführt, dass der Namensraum der lokalen und globalen namespaces. So zu beantworten, Ihre problem, wir können strip filestore unten durch weglassen der top-level-Paket, das wird nie berücksichtigt werden, indem der interpreter, wenntest.py
als ein Programm ausgeführt. Es würde dann so Aussehen:Nun
subpackage
ist nicht länger ein sub-package, wie wir Sie entfernt haben, mit Paket als irrelevant. Die Konzentration auf, warum diedo_something
name nicht definiert ist, könnte helfen.test.py
enthält keine importieren, und so ist es unklar, wie Sie erwarten, dassdo_something
erwerben Bedeutung. Sie könnte damit es funktioniert, indem Sie mit einer leerensubpackage/__init__.py
und danntest.py
Lesen konnteAlternativ können Sie uns eine
subpackage/__init__.py
liestlegt die
do_something
- Funktion in dersubpackage
- namespace, wenn das Paket importiert wird. Dann mit einemtest.py
importieren der Funktion aus dem Paket, wie dieses:Letzte alternative mit der gleichen
__init__.py
ist die Verwendung einestest.py
, die importiert einfach die (unter -) Paket und dann ist die relative Benennung den Zugriff auf die gewünschten Funktion:Zugang zu Ihr in Ihrer lokalen namespace
Mit der leeren
__init__.py
dies könnte auch erreicht werden, mit einemtest.py
Lesenoder sogar
Letztlich das beste Werkzeug, um Sie zu halten, gerade ist ein klares Verständnis, wie der import funktioniert und welche Auswirkungen die verschiedenen Formen haben auf den Import namespace.
Erste, Sie haben zu verstehen, wie
import
allein arbeiten:Versuchen würde zu laden
do_something
aussubmodule
sich geladen austest
.Die Sie laden möchten etwas von
subpackage
, so starten Sie mit, dass:Gut,
subpackage/__init__.py
geladen wird.Nun, Sie wollen die
do_something()
Funktion, die in der Datei ("Modul")hello_world.py
. Ganz einfach:Und Sie sind fertig! Lesen Sie einfach diese Zeile laut, es tut genau das was es sagt: import
do_something
aus dem Modulhello_world
die in dersubpackage
Paket.Versuchen, in
test.py
Es sollte gut funktionieren.
Nun, das zweite Problem:
__init__.py
wird nicht genannt werden inpackage/
da Sie nichtpackage/
als Paket.__init__.py
wird verwendet, wenn Sie einen import vonpackage/
oder irgendetwas, zB:Ansonsten wird Sie nicht geladen werden.
Jedoch, wenn Sie möchten, laden
do_something()
auf den import von subpackage setzenfrom submodule.hello_word import do_something
imsubpackage/__init__.py
, und dann, in die Sietest.py
ist, machen Sie eineimport subpackage
.import test.submodule.do_something
versuche zu tun. Würden Sie stattdessen gezwungen werden, zu verwendenimport test.submodule
wenn Sie wollten, dass die Referenztest.submodule.do_something
um gültig zu sein. Wenn Sieimport os.path
werden Sie feststellen, dass dieos
- Modul vorhanden ist, in der Import-namespace - wo sonst könnteos.path
Leben?Es ist eine absolute hard-und-schnell-Regel in Python, dass ein name muss immer definiert werden oder importiert werden, in das Modul, wo Sie Sie verwenden. Hier Sie nie importieren alles, was im inneren test.py - so wie der Fehler sagt,
do_something
ist nicht definiert.Selbst wenn Ihr
package/__init__.py
Datei ausgeführt wurde (die, wie andere haben darauf hingewiesen, es ist nicht), die Ihren code noch nicht funktionieren würde, wie es ist, weil der import vondo_something
hat zu tun im inneren test.py wenn Sie möchten, zu verweisen, die in dieser Datei.