Frage zum importieren von Modulen!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Mittwoch 29. November 2006, 18:39

Hallo Alle zusammen! :)

Ich habe mal eine Frage zum importieren von Modulen.

Ich seh mitlerweile in den ganze Libarys und Modulen in meinem Program.

Ich habe immo folgende Struktur:

Code: Alles auswählen

daucms.py
__init__.py
    |- system/
         |- template.py
         |- handler.py
         |- __init__.py
    |- templates/
         |- viele Templates... :D
So.
Über die '' daucms.py '' sollte im Normalfall ALLES gestartet werden.
Von dort importiere ich die Hauptapplikation aus der '' handler.py '' und wird dan halt in der '' daucms.py '' gestartet.

Leider klappt der Zugriff der '' template.py '' auf das Zentrale Templates-Verzeichnis nicht so ganz.

Immo importiere ich hier und da vereinzelte Sachen... aber so richtig is das nicht das ware.

Wie kann ich einen Zentralen Import machen, der dann alles mit sich zieht. In diesem müssen auch verschiedene ' path ' Daten an einzelne Module(im System-Ordner) übermittelt werden.

Wo müsste ich das und wie machen? Wie könnten dann die Module darauf zugreifen (die, aus dem 'system' Ordner)

MfG EnTeQuAk

EDIT:

Oder anders gesagt. Ginge es auch einen "Programmpfad" zu definieren, von dem ALLE Module usw. importieren? So hab ich dann halt kein Problem, mit der Verzeichnisstruktur... :D
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mittwoch 29. November 2006, 18:54

Hey gute Frage! :D *ich auch wissen wollen*

lg

EDIT: BTW: [ot] gfx-united ist von dir? -> :bigok: [/ot]
BlackJack

Mittwoch 29. November 2006, 19:17

Ich weiss nicht ob ich's ganz verstanden habe, aber Module kennen ihre eigene Datei entweder relativ zum Arbeitsverzeichnis oder absolut. Der Pfad ist in jedem Modul unter dem Namen `__file__` verfügbar.

Oder sind in `templates` keine Daten sondern Module? Dann kommst Du mit einem absoluten Namen ran, also ``import xyz.templates.modulname``, wobei `xyz` der Packagename ist in dem `daucms.py` liegt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Mittwoch 29. November 2006, 21:36

Danke BlackJack! :)
Werde es dann mal ausprobieren. Morgen früh, wenn meine Nachtschicht vorbei ist... *grml*

Wusste gar nicht, das es da auch so was wie absolut und relativ gibt :) Hey man lernt immer wieder dazu :D



EDIT: BTW: [ot] gfx-united ist von dir? -> :bigok: [/ot]
Sagen wirs so: Ohne mich würde es unter anderem nicht existieren, da ich das ganze von anfang an mit aufgebaut habe. Es stecken aber mitlerweile mehr als 5 Personen hinter dem ganzen :) (brauchen auch immer verstärkung!)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Donnerstag 30. November 2006, 12:21

So das habe ich mal so ein wenig ausprobiert. Das mit dem Absoluten Pfad funktioniert.

Also z.B.

Code: Alles auswählen

from daucms.system import template
Das wäre kein Problem. Aber so richtig funktionieren tut das nicht.

Folgedes Script

Code: Alles auswählen

#!/usr/bin/env python
import sys
print 'systempfad: ',sys.path[0],'\n\n'
import daucms.test.test3

print test.output()
Folgender Output:

Code: Alles auswählen

systempfad:  /home/ente/Desktop/daucms/system 


Traceback (most recent call last):
  File "testing.py", line 4, in ?
    import daucms.test.test3
ImportError: No module named daucms.test.test3
Jedoch gibt es das Modul '' daucms.test.test3 ''. Es liegt direkt im Verzeichnis '' daucms'' ein Ordner '' test'' und da eine '' test3.py ''.
Im '' test '' Ordner ist auch eine '' __init__.py ''. Aber irgentwie scheint er das nicht so ganz zu finden.

Von welchem Pfad geht er immer aus beim Importieren?
Er muss sich ja irgentwie einen absoluten Pfad intern zusammenbasteln oder? Kann man das irgentwie beeinflussen?

Die andere Frage.
Was für eine Rolle spielt die __init__.py. Ich sehe ab und zu, das in dieser auch Module imortiert werden. Sind die dann für die Scripte, die im Verzeichnis der __init__.py liegen oder für das Script, was z.B. das Verzeichnis '' system '' importiert?


MfG EnTeQuAk
BlackJack

Donnerstag 30. November 2006, 13:39

EnTeQuAk hat geschrieben:Folgedes Script

Code: Alles auswählen

#!/usr/bin/env python
import sys
print 'systempfad: ',sys.path[0],'\n\n'
import daucms.test.test3

print test.output()
Folgender Output:

Code: Alles auswählen

systempfad:  /home/ente/Desktop/daucms/system 


Traceback (most recent call last):
  File "testing.py", line 4, in ?
    import daucms.test.test3
ImportError: No module named daucms.test.test3
Jedoch gibt es das Modul '' daucms.test.test3 ''. Es liegt direkt im Verzeichnis '' daucms'' ein Ordner '' test'' und da eine '' test3.py ''.
Im '' test '' Ordner ist auch eine '' __init__.py ''. Aber irgentwie scheint er das nicht so ganz zu finden.

Von welchem Pfad geht er immer aus beim Importieren?
Er muss sich ja irgentwie einen absoluten Pfad intern zusammenbasteln oder? Kann man das irgentwie beeinflussen?
Es wird in `sys.path` gesucht. Da ist für gewöhnlich auch das Verzeichnis enthalten, von dem aus das Skript gestartet wurde. Auf jeden Fall kannst Du in dem Skript den Pfad zum Skript herausfinden und zu `sys.path` hinzufügen.
Die andere Frage.
Was für eine Rolle spielt die __init__.py. Ich sehe ab und zu, das in dieser auch Module imortiert werden. Sind die dann für die Scripte, die im Verzeichnis der __init__.py liegen oder für das Script, was z.B. das Verzeichnis '' system '' importiert?
Die `__init__.py` ist sozusagen der Code der im Package steht. Beispiel:

spam/
    __init__.py

Und in der `__init__.py` steht ``answer = 42``, dann kannst Du folgendes machen:

Code: Alles auswählen

import spam

print spam.answer
Wenn in der `__init__.py` importiert wird, sind die importierten Objekte auch über den Paketnamen referenzierbar. Wenn zum Beispiel ein Modul vom Quelltext her zu gross wird, man den Inhalt aber immer noch gerne in einem Namensraum hätte, kann man das Modul in mehrere Module aufteilen und in ein Package packen und dort in der `__init__.py` die Inhalte der einzelnen Module wieder in einen Namensraum holen. Falls der Packagename der des alten Moduls ist, bekommt man "von aussen" davon nicht einmal etwas mit.
Benutzeravatar
jens
Moderator
Beiträge: 8481
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 30. November 2006, 16:19

Eine __init__ sollte auch in templates sein, ich pack dazu mal template1.py. Im root brauchst du eigentlich keine __init__.

Also es sieht so aus:

Code: Alles auswählen

daucms.py
    |- system/
         |- __init__.py
         |- template.py
         |- handler.py
         ...
    |- templates/
         |- __init__.py
         |- template1.py
         ...
[/quote]

also in daucms.py importierst du template.py mit "from system import template"
In system.template importierst du die Templates mit "from templates import template1", weil dein aktuelles Verzeichnis das ist indem duacms.py liegt...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten