[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