Path: csiph.com!aioe.org!.POSTED!not-for-mail From: Peter Otten <__peter__@web.de> Newsgroups: de.comp.lang.python Subject: Re: Import problem im Eigendem Module Paket Date: Fri, 05 Oct 2018 22:10:24 +0200 Organization: None Lines: 109 Message-ID: References: NNTP-Posting-Host: Cnjf3Rk+3elNPuM4pnud4A.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Complaints-To: abuse@aioe.org User-Agent: KNode/4.13.3 X-Notice: Filtered by postfilter v. 0.8.3 Xref: csiph.com de.comp.lang.python:5260 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 > 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 > > > > #!/usr/bin/env python3 > # -*- coding: utf-8 -*- > > from ..config import daten as da > > print(da.down) > > > > Inhalt der daten.py > > > > #!/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 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").