Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5258 > unrolled thread
| Started by | Manfred Gil <manfred-gil@t-online.de> |
|---|---|
| First post | 2018-10-05 17:04 +0000 |
| Last post | 2018-10-07 09:20 +0000 |
| Articles | 6 — 5 participants |
Back to article view | Back to de.comp.lang.python
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
| From | Manfred Gil <manfred-gil@t-online.de> |
|---|---|
| Date | 2018-10-05 17:04 +0000 |
| Subject | Import 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]
| From | Stefan Schwarzer <sschwarzer@sschwarzer.net> |
|---|---|
| Date | 2018-10-05 20:49 +0200 |
| Subject | Re: [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]
| From | Peter Otten <__peter__@web.de> |
|---|---|
| Date | 2018-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]
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| Date | 2018-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]
| From | Hartmut Goebel <h.goebel@goebel-consult.de> |
|---|---|
| Date | 2018-10-07 10:52 +0200 |
| Subject | Re: [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]
| From | Manfred Gil <manfred-gil@t-online.de> |
|---|---|
| Date | 2018-10-07 09:20 +0000 |
| Subject | Re: [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