Modul in Unterordner; from x.y import z geht, aber nicht import x.y

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ulukaii
User
Beiträge: 4
Registriert: Dienstag 14. Juni 2016, 09:49

Hallo,

ich habe Probleme, das Import-statement zu verstehen. Habe auch schon http://py-tutorial-de.readthedocs.io/de ... dules.html durchgelesen, welches aber nur eine Kope der englischen version. ist.

Folgende Struktur:

MeinProjekt

Code: Alles auswählen

Projektordner:
    __init__.py
    machwas.py
    Unterordner:
              yate.py


In der Datei yate.py befindet sich eine Funktion response() .Diese will ich vom Modul machwas.py aufrufen. Wenn ich in machwas.py schreibe:

Code: Alles auswählen

from Unterordner.yate import response()
dann geht es. Wenn ich jedoch schreibe

Code: Alles auswählen

import Unterordner.yate
dann bekomme ich NameError: name 'response' is not defined

Ich nutze Python3 unter Eclipse mit PyDev. Woran kann es liegen? Folgendes steht im PYTHONPATH unter Project->Properties:
Source Folders: /${PROJECT_DIR_NAME}
External Libraries: /home/ulu/Projektordner


Beste Grüße und danke für die Hilfe
Ulu
BlackJack

@Ulukaii: Du müsstest etwas sorgfältiger mit der Problembeschreibung sein. Das hier geht sicher nicht:

Code: Alles auswählen

from Unterordner.yate import response()
Das führt zu einem `SyntaxError`. Wenn man die Klammern am Ende weg lässt, dann sollte man einen `ImportError` bekommen weil `Unterordner` kein Package ist, denn da liegt nach Deinen Angaben keine `__init__.py` drin. Sollte das trotzdem funktionieren, dann wäre `Projektordner/Unterordner` im Suchpfad für Module — das sollte aber nicht sein wenn Projektordner ein Package ist. Das gäbe am Ende nur Chaos und Verwirrung.
Das hier:

Code: Alles auswählen

import Unterordner.yate
Sollte aus den gleichen Gründen zu einem `ImportError` führen, aber auf keinen Fall zu einem `NameError` wegen `response`. Jedenfalls nicht wegen der Zeile. Da müsstest Du dann mal den gesamten Traceback zeigen wo denn da auf `response` zugegriffen wird.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:Wenn man die Klammern am Ende weg lässt, dann sollte man einen `ImportError` bekommen weil `Unterordner` kein Package ist, denn da liegt nach Deinen Angaben keine `__init__.py` drin.
Das Tutorial bezieht sich auf Python 3 und ich denke mal man kann davon ausgehen dass auch OP dann Python 3 nutzt. Seit Python 3.3 gibt es Implicit Namespace Packages (PEP 420) die ohne __init__.py auskommen. Zu einem ImportError kommt es dann nicht.

Solange man allerdings nicht Namespace Packages haben möchte - im Zweifel will man die nicht - sollte man trotzdem eine __init__.py in Packages platzieren.
BlackJack

Igitt, was ist das denn? Was ist aus „explicit is better than implicit” geworden‽ Hätte man dafür nicht eine andere Datei zum kennzeichnen nehmen können‽ Klar, da ist das Problem mit dem Inhalt, aber da hätte man ja einfach definieren können das der ignoriert wird.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das hat man ganz explizit und der Pragmatik wegen ignoriert :roll:
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ulukaii hat geschrieben:

Code: Alles auswählen

import Unterordner.yate
dann bekomme ich NameError: name 'response' is not defined
Der Fehler kommt aber sicher nicht beim Import, sondern dort wo du das nicht vorhandene `response` verwenden möchtest.
Ulukaii
User
Beiträge: 4
Registriert: Dienstag 14. Juni 2016, 09:49

Hallo,

vielen dank für die Antworten.

[*]Syntax - Error mit den Klammern war natürlich ein Schreibfehler von mir hier im Forum
[*] __init__.py war überall vorhanden
[*] habe es trotzdem nicht hinbekommen
[*] bin zu PyCharm gewechselt und da habe ich es nach wenigen Minuten rausgefunden, wie ich die Folder als Sources markiere.

Jetzt geht es.
Antworten