Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5258 > unrolled thread

Import problem im Eigendem Module Paket

Started byManfred Gil <manfred-gil@t-online.de>
First post2018-10-05 17:04 +0000
Last post2018-10-07 09:20 +0000
Articles 6 — 5 participants

Back to article view | Back to de.comp.lang.python


Contents

  Import problem im Eigendem Module Paket Manfred Gil <manfred-gil@t-online.de> - 2018-10-05 17:04 +0000
    Re: [Python-de] Import problem im Eigendem Module Paket Stefan Schwarzer <sschwarzer@sschwarzer.net> - 2018-10-05 20:49 +0200
    Re: Import problem im Eigendem Module Paket Peter Otten <__peter__@web.de> - 2018-10-05 22:10 +0200
    Re: Import problem im Eigendem Module Paket Hermann Riemann <nospam.ng@hermann-riemann.de> - 2018-10-06 10:19 +0200
    Re: [Python-de] Import problem im Eigendem Module Paket Hartmut Goebel <h.goebel@goebel-consult.de> - 2018-10-07 10:52 +0200
      Re: [Python-de] Import problem im Eigendem Module Paket Manfred Gil <manfred-gil@t-online.de> - 2018-10-07 09:20 +0000

#5258 — Import problem im Eigendem Module Paket

FromManfred Gil <manfred-gil@t-online.de>
Date2018-10-05 17:04 +0000
SubjectImport problem im Eigendem Module Paket
Message-ID<pp85j1$7e1$1@tota-refugium.de>
Hallo Liste,

ich Arbeite gerade mit einem selbsterstellten Module.

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.

Danke und Gruß

Manfred

System:
Debian 9.5
Python Version: 3.5.3

[toc] | [next] | [standalone]


#5259 — Re: [Python-de] Import problem im Eigendem Module Paket

FromStefan Schwarzer <sschwarzer@sschwarzer.net>
Date2018-10-05 20:49 +0200
SubjectRe: [Python-de] Import problem im Eigendem Module Paket
Message-ID<mailman.126.1538765374.20824.python-de@python.org>
In reply to#5258
On 05/10/2018 19.04, Manfred Gil wrote:
> ich Arbeite gerade mit einem selbsterstellten Module.
> 
> 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 verstehe das so, dass du erst `my_paket` (der
Parent von `config`) `import`ieren musst.

> 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.

Die Definition von `__all__` bestimmt nur, was bei
einem `from module import *` in den Namensraum des
importierenden Moduls importiert werden soll.

> Andere schreiben wiederrum, das in dieser __init__.py
> man div. Importe machen sollte damit der import in der Modulen klappt.

Kommt drauf an, was man unter "klappen" versteht. ;-)

Nimm an, du hast folgende Paket-Struktur:

a
  b
  c

sowie dein Modul `my_module`.

Wenn in `a/__init__.py` keine Imports stehen, musst du in
`my_module`

  import a.b

schreiben, wenn du auf Attribute in `a.b` zugreifen willst.

Wenn in `a/__init__.py` der Import

  import a.b

steht, reicht in Modul `my_module` schon der Import

  import a

um auf `a.b` und seine Attribute zugreifen zu können, weil
`a.b` bereits mit dem Import von `a` importiert wurde. Das
passiert nicht implizit ohne `import`-Anweisungen.

Ich würde allerdings eher explizite Imports in `my_module`
verlangen, das erscheint mir sauberer. Also nicht in
`a/__init__.py` Imports irgendwelcher "Unter-Module"
vornehmen, sondern den Nutzer deiner Bibliothek alle
nötigen Module explizit importieren lassen.

Ich hoffe, ich konnte etwas helfen.

Viele Grüße
Stefan

[toc] | [prev] | [next] | [standalone]


#5260

FromPeter Otten <__peter__@web.de>
Date2018-10-05 22:10 +0200
Message-ID<pp8gh3$17qh$1@gioia.aioe.org>
In reply to#5258
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").

[toc] | [prev] | [next] | [standalone]


#5261

FromHermann Riemann <nospam.ng@hermann-riemann.de>
Date2018-10-06 10:19 +0200
Message-ID<g1r9flF6r19U1@mid.individual.net>
In reply to#5258
Am 05.10.2018 um 19:04 schrieb Manfred Gil:

> ich Arbeite gerade mit einem selbsterstellten Module.

> Mein Problem ist das ich kein Module aus einem Übergeordnetem
> Ordner importieren kann.

Geht mit sys.path.append("$Ordnername")

( Zur Not Dateien  nach "/tmp/"+os.getpid() kopieren
   und dann sys.path.append("/tmp/"+os.getpid()) verwenden.)

Hermann
    der ohne __init__.py auskommt.

-- 
http://www.hermann-riemann.de

[toc] | [prev] | [next] | [standalone]


#5262 — Re: [Python-de] Import problem im Eigendem Module Paket

FromHartmut Goebel <h.goebel@goebel-consult.de>
Date2018-10-07 10:52 +0200
SubjectRe: [Python-de] Import problem im Eigendem Module Paket
Message-ID<mailman.5.1538902734.2799.python-de@python.org>
In reply to#5258

[Multipart message — attachments visible in raw view] — view raw

Hallo,

Am 05.10.2018 um 19:04 schrieb Manfred Gil:
> 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

Um das bisher geschriebene noch zu ergänzen, bzw. deutlich zu machen:

Das "import" Statement bezieht sich immer auf Module, *nie* auf
Verzeichnisse. Der relative Import bezieht sich also auf übergeordnete
Module. Auch wenn Module in Verzeichnissen zu Paketen gesammelt werden,
geht es nicht um Verzeichnisse.

Wie Peter schon geschrieben hat

Wenn Du die Datei my_paket/daten/import_test.py so aufrufst "python
my_paket/daten/import_test.py", dann ist es ein Skript und eben nicht
Teil einen Pakets. Und damit funktionieren relative Imports nicht, denn
die sind nur in Paketen zulässig.

Verwendest Du jedoch "python -m my_paket.daten.import_test", dann führst
Du das Module mit diesem Namen aus. Das Module "kennt" das Paket, zu dem
es gehört und damit funktionieren relative Imports.

-- 
Schönen Gruß
Hartmut Goebel
Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
Information Security Management, Security Governance, Secure Software
Development

Goebel Consult, Landshut
http://www.goebel-consult.de

Blog:
https://www.goe-con.de/blog/dsl-fernkonfiguration-ist-kritisch-fur-den-datenschutz

Kolumne:
https://www.goe-con.de/hartmut-goebel/cissp-gefluester/2012-04-compliance-bringt-keine-sicherheit


[toc] | [prev] | [next] | [standalone]


#5263 — Re: [Python-de] Import problem im Eigendem Module Paket

FromManfred Gil <manfred-gil@t-online.de>
Date2018-10-07 09:20 +0000
SubjectRe: [Python-de] Import problem im Eigendem Module Paket
Message-ID<ppcj4o$26d$1@tota-refugium.de>
In reply to#5262
Hallo,

Am Sun, 07 Oct 2018 10:52:13 +0200 schrieb Hartmut Goebel:

> Hallo,
> 
> Am 05.10.2018 um 19:04 schrieb Manfred Gil:
>> 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
> 
> Um das bisher geschriebene noch zu ergänzen, bzw. deutlich zu machen:
> 
> Das "import" Statement bezieht sich immer auf Module, *nie* auf
> Verzeichnisse. Der relative Import bezieht sich also auf übergeordnete
> Module. Auch wenn Module in Verzeichnissen zu Paketen gesammelt werden,
> geht es nicht um Verzeichnisse.
> 
> Wie Peter schon geschrieben hat
> 
> Wenn Du die Datei my_paket/daten/import_test.py so aufrufst "python
> my_paket/daten/import_test.py", dann ist es ein Skript und eben nicht
> Teil einen Pakets. Und damit funktionieren relative Imports nicht, denn
> die sind nur in Paketen zulässig.
> 
> Verwendest Du jedoch "python -m my_paket.daten.import_test", dann führst
> Du das Module mit diesem Namen aus. Das Module "kennt" das Paket, zu dem
> es gehört und damit funktionieren relative Imports.

Danke nochmals, auch dir Peter, für die erläuterungen.

Ich hab nun den Denkfehler erkannt und im Nachhinein ist mir auch klar warum
das ganze nicht Funktionieren konnte.

Der Interpreter kannte halt die Ordnerstrucktur ( Modul strucktur ) beim
aufruf halt nicht.

Gruß
Man<und wieder was da zu gelernt>fred

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.python


csiph-web