Kann nicht python-Modul aus einem Unterverzeichnis mit einer einfachen Import-Anweisung importieren

So möchte ich ein Modul aus einem Python-Paket importieren, das ein Unterverzeichnis desjenigen ist, in dem sich das Haupt-Skript befindet. Dies ist die Verzeichnisstruktur:

maindir \ - main.py - modules \ - __init__.py - module.py 

Was finde ich seltsam ist, dass ich nicht module.py mit einem einfachen import modules.module , denn wenn ich dann versuche, die Funktion module.foo() in main.py , gibt es NameError: name 'module' is not defined . Allerdings, wenn ich import modules.module as module , alles funktioniert gut, das gleiche mit from modules import module . Und wenn module.py befindet sich im gleichen Verzeichnis wie main.py , ein einfaches import module ist völlig ausreichend für den Aufruf module.foo() .

Nun ist die Frage, warum ist das? Warum ist keine einfache import Anweisung genug für den Import eines Moduls aus einem Paket anstelle des Verzeichnisses, in dem das Skript ist? Oder mache ich etwas anderes falsch Eine Antwort würde wirklich geschätzt werden, da ich jetzt ziemlich verwirrt bin …

2 Solutions collect form web for “Kann nicht python-Modul aus einem Unterverzeichnis mit einer einfachen Import-Anweisung importieren”

Es importiert das Modul, es macht einfach nicht seinen Namen direkt zugänglich. Wenn Sie import foo.bar , ist der Name, der importiert wird, foo und bar ist nur als Attribut davon zugänglich. Sie verwenden diese Form von Import, wenn das ist, was Sie wollen; Das ist es Wenn Sie das nicht wollen, verwenden Sie eine andere Form der Import-Anweisung.

Wenn du in der Lage sein modules.module , module anstelle von modules.module , import modules.module as module entweder import modules.module as module , wie du gefunden hast, oder von modules.module machen.

Wenn Sie importieren, müssen Sie noch die vollständige Paket-Syntax verwenden, um die Funktion foo zu verwenden.

Das untenstehende sollte funktionieren

 import modules.module modules.module.foo() 

Ein besserer Weg, dies zu tun ist

 from modules import module module.foo() 

Eine dritte weniger elegante Art (aber genau die gleiche wie die oben) ist:

 import modules.module as module module.foo() 
Python ist die beste Programmiersprache der Welt.