[Python-de] Import problem im Eigendem Module Paket
Peter Otten
__peter__ at web.de
Fr Okt 5 16:10:24 EDT 2018
Manfred Gil wrote:
> Mein Problem ist das ich kein Module aus einem Übergeordnetem
> Ordner importieren kann.
>
> Ich bekomme stets die Fehlermeldung:
>
> File "import_test.py", line 4, in <module>
> from ..config import daten as da
> SystemError: Parent module '' not loaded, cannot perform relative import
>
> ich habe schon einiges probiert, sowohl ein oder auch zwei Punkte bei der
> Importzeile
> from .config import daten as da
> from ..config import daten as da
>
> Mein Paket sieht wie folgt aus:
> ##### < Ordnerstrucktur > ###
>
> ----my_paket
> __init__.py #(leer)
> config.ini
> ablauf.py
>
> config (Ordner)
> __init__.py #(leer)
> daten.py
>
> daten (Ordner)
> __init__.py #(leer)
> import_test.py
>
> ##### < Ordnerstrucktur > ###
>
> Inhalt der imoprt_test.py
>
> <code>
>
> #!/usr/bin/env python3
> # -*- coding: utf-8 -*-
>
> from ..config import daten as da
>
> print(da.down)
>
> </>
>
> Inhalt der daten.py
>
> <code>
>
> #!/usr/bin/env python3
> # -*- coding: utf-8 -*-
> #
>
> # Downloadlink
> down = 'https://example.com'
>
> </>
>
> Ich hab gelesen das man die __init__.py eigendlich leer lassen sollte,
> jedoch schreiben andere das mit einem
> __all__ = ['auflistung der Ordner']
> es gehen sollte, was bei mir noch nicht der fall ist.
> Andere schreiben wiederrum, das in dieser __init__.py
> man div. Importe machen sollte damit der import in der Modulen klappt.
>
> Kann hier jemand licht in mein Dunkles Kämmerlein bringen.
Wenn du ein Submodul als Skript aufrufst
$ mkdir -p mein_paket/{config,daten}
$ echo 'print("CONFIG-DATEN")' > mein_paket/config/daten.py
$ echo -e 'from ..config import daten\nprint("DATEN-TEST")' > mein_paket/daten/import_test.py
$ python3 mein_paket/daten/import_test.py
Traceback (most recent call last):
File "mein_paket/daten/import_test.py", line 1, in <module>
from ..config import daten
SystemError: Parent module '' not loaded, cannot perform relative import
dann "weiß" das Skript nicht, dass es Teil eines Packages ist.
Um das zu vermeiden schreibst du ein Wrapper-Skript, das das Module
importiert (hier simuliert mit dem Interpreter):
$ python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mein_paket.daten.import_test
CONFIG-DATEN
DATEN-TEST
>>>
Oder du verwendest die Option -m:
$ python3 -m mein_paket.daten.import_test
CONFIG-DATEN
DATEN-TEST
Im letzten Fall funktioniert auch ein Test
if __name__ == "__main__": ...
wie gewohnt.
PS: Wie gesehen kommt man auch komplett ohne __init__.py aus (nennt sich
"namespace package").
Mehr Informationen über die Mailingliste python-de