Python - warum kann ich import-Module ohne __init__.py überhaupt?
Ich bin neu in Python und ich habe immer noch nicht meinen Kopf herum, warum brauchen wir eine __init__.py
file import Module. Ich habe durch die anderen Fragen und Antworten, wie diese.
Was mich verwirrt ist, dass ich importieren kann meine Module ohne __init__py
, so warum brauche ich es überhaupt?
Meinem Beispiel,
index.py
modules/
hello/
hello.py
HelloWorld.py
index.py,
import os
import sys
root = os.path.dirname(__file__)
sys.path.append(root + "/modules/hello")
# IMPORTS MODULES
from hello import hello
from HelloWorld import HelloWorld
def application(environ, start_response):
results = []
results.append(hello())
helloWorld = HelloWorld()
results.append(helloWorld.sayHello())
output = "<br/>".join(results)
response_body = output
status = '200 OK'
response_headers = [('Content-Type', 'text/html'),
('Content-Length', str(len(response_body)))]
start_response(status, response_headers)
return [response_body]
modules/hello/hello.py,
def hello():
return 'Hello World from hello.py!'
modules/hello/HelloWorld.py,
# define a class
class HelloWorld:
def __init__(self):
self.message = 'Hello World from HelloWorld.py!'
def sayHello(self):
return self.message
Ergebnis,
Hello World from hello.py!
Hello World from HelloWorld.py!
Was es braucht ist nur diese zwei Zeilen,
root = os.path.dirname(__file__)
sys.path.append(root + "/modules/hello")
Ohne __init__py
. Kann mir jemand erklären, warum es funktioniert auf diese Weise?
Wenn __init__py
ist der richtige Weg, was sollte ich tun/ändern in meinem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
__init__.py
ist für Pakete. Ein Paket enthält eine Sammlung von zugehörigen Module. Wenn Sie nur ein einzelnes Modul, das Sie verwenden möchten, brauchen Sie nicht zu verwenden__init__.py
; setzen Sie einfach die einzelnen.py
Datei irgendwo auf dem system Pfad und Sie können es importieren.Dem Zweck, Pakete nicht zuzulassen, Ihnen den import der Module, die innerhalb Sie. Es ist die Gruppe die Module zusammen. Der größte Vorteil von diesem ist, dass, wenn ein Modul in einem Paket, dann das Modul importieren können andere Module aus dem Paket mit der relativen Importe. Wenn Sie
foo.py
undbar.py
im gleichen Paket, dannfoo
tun könnenfrom . import bar
. Dies macht der intra-Paket importiert kompakter und einfacher zu reorganisieren, wenn Sie restrukturieren das Paket oder den Namen ändern.Auch, ein offensichtlicher Vorteil ist. . . wenn Sie machen es zu einem Paket, die Sie nicht zu tun haben, dass
sys.path
Zeug alle Zeit, die Sie importieren möchten etwas von ihm.json
Modul, es werden Schatten der globalenjson
Modul. Aber wenn Sie es machenmypackage.json
es wird nicht dazu führen, dass solche Konflikte (zumindest in Python 3 und Python 2 mitfrom __future__ import absolute_import
).__init__.py
? danke.__init__.py
- Datei. Python 3.3 entfernt dieser Anforderung finden Sie unter PEP 420. Es klingt wie Sie vielleicht nicht wissen viel über Pakete, obwohl, so dass vor dem Lesen der PEP, möchten Sie vielleicht zu Lesen den entsprechenden Abschnitt der Python-docs first.Ich denke, dass dies möglicherweise aufgrund von Python-version, die Sie verwenden. Ich habe einige Experimentieren und fand heraus, dass folgende Struktur:
Inhalt main.py:
und Inhalt file.py:
Wenn ich ausführen
main.py
mit Python 2.7.12 bekomme ichImportError
während der Ausführung vonmain.py
mit Python 3.5.2 funktioniert einfach.Nach dem hinzufügen
__init__.py
im packages-Verzeichnis, code funktioniert mit beiden Versionen von Python.Basierend auf diese link: Seit Python 3.3
Dateien mit dem Namen
__init__.py
verwendet werden markieren Sie die Verzeichnisse auf der Festplatte als Python-package-Verzeichnisse. Wenn Sie die Dateiensowie
modules
ist in Ihrem Pfad befindet, können Sie den code importieren inmodule.py
alsoder
Wenn Sie entfernen die
__init__.py
Datei, Python wird nicht mehr für die teilmodule in diesem Verzeichnis, so versucht das Modul importieren, wird fehlschlagen.Den
__init__.py
- Datei ist in der Regel leer, kann aber verwendet werden, zu exportieren ausgewählte Teile des Pakets unter einem passenderen Namen, halten Sie die Komfort-Funktionen, etc. Angesichts der oben genannten Beispiel, der Inhalt der init-Modul zugegriffen werden kann, mitUnd schließlich ist hier, was die offizielle Dokumentation zu sagen hat über diese Datei:
Die
__init__.py
- Dateien werden benötigt, um Python behandeln, dieVerzeichnisse mit Paketen; dies wird getan, um zu verhindern, dass
Verzeichnisse, die mit einem gemeinsamen Namen, wie "string", aus
unabsichtlich versteckt, gültige Module, die erst später auftreten auf der
Modul-Suchpfad. Im einfachsten Fall
__init__.py
können nureine leere Datei sein, aber es kann auch das ausführen von code für die Initialisierung
für das Paket oder stellen Sie die
__all__
variable, der später beschrieben wird.mydir/spam/__init__.py mydir/spam/module.py
ist nicht das gleiche wiemodules/hello/hello.py
in meinem Beispiel?import spam.module
? Und wo ist der Einstiegspunkt, der - wie index.py?import spam module
in andere python-Datei, so lange wiemodules
ist auf dem Weg. Tut mir Leid, ich bin nicht sicher was du meinst mit entry point. Lesen @BrenBarn Antwort auch in diesem thread. Es ist aufschlussreich ist.Ich denke, das ist eine gute 'Antwort' für das, was ich nicht Verstand.
myMath/__init__.py
index.py