Eigene Module einzubinden, klappt nicht

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
Gab
User
Beiträge: 21
Registriert: Montag 17. August 2009, 14:45

Hallo, allerseits,

ich versuche gerade, aus meinen Scripts eine eigene Bibliothek aufzubauen, die alle Module enthält, die ich immer wieder brauche.

Folgendes habe ich gemacht:
Verzeichnis angelegt \gab\ in das Verzeichnis, in dem der Hauptscript liegt.
In dieses Verzeichnis eine __init__.py angelegt
Verzeichnis \gab\test\ angelegt.
In dieses Verzeichnis eine __init__.py angelegt
Und eine Datei aufruf.py angelegt mit entsprechendem Code.

Wenn ich nun im eigentlichen Script folgendes mache:

Code: Alles auswählen

import gab.test as test
Berechnung = test.aufruf ()
erhalte ich die Fehlermeldung
'module' object has no attribute 'aufruf'
Was ist der Fehler?

Danke
Gab
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Funktioniert das auch nicht?

Code: Alles auswählen

import gab.test.aufruf
Du kannst ein Modul nicht als Funktion aufrufen, allerdings scheint das nicht das Problem zu sein?!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bei Deiner Beschreibung sollte es so gehen:

Code: Alles auswählen

import gab.test.aufruf as test

test.was_auch_immer()
Gab
User
Beiträge: 21
Registriert: Montag 17. August 2009, 14:45

Nichts von beidem geht.
import gab.test.aufruf

gibt die gleiche Fehlermeldung aus.

Weitere Frage:
Das Modul aufruf.py beinhaltet den Code der früheren Funktion ohne

Code: Alles auswählen

def ...():
Korrekt?

Gab
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gab hat geschrieben:Nichts von beidem geht.
Was kommt denn als Meldung?

Wo liegt denn das Script, welches den import beinhaltet? Direkt oberhalb von gab? Oder steht das Modul im Suchpfad?
Gab
User
Beiträge: 21
Registriert: Montag 17. August 2009, 14:45

Die Meldung:
ImportError: No module named aufruf
Verzeichnisbaum:
  • \haupt
    script.py
    \haupt\gab
    __init__.py
    \haupt\gab\test
    __init__.py
    aufruf.py
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Gab hat geschrieben:Nichts von beidem geht.
import gab.test.aufruf

gibt die gleiche Fehlermeldung aus.

Weitere Frage:
Das Modul aufruf.py beinhaltet den Code der früheren Funktion ohne

Code: Alles auswählen

def ...():
Korrekt?

Gab
Nein das ist nicht korrekt. Ein Modul kann nicht als Funktion implementiert werden. In der Regel hat mein ein Modul, also eine .py Datei in der mehrere Funtkionen, Classen usw implementiert sind.
Python erlaubt es auch nicht das ein Modul "aufgerufen" werden kann.

Vielleicht hilft folgender Code um deinem Problem auf die Schliche zu kommen

Code: Alles auswählen

import gab
print "modul gab:", gab.__file__
from gab import test
print "modul test:", test.__file__
Vielleicht werden ja garnicht die Dateien importiert die du erwartest.

Edit: Nachdem ich jetzt den Verzeichnisbaum gesehen habe, glaube ich nicht das da der Fehler liegt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gab hat geschrieben:Die Meldung:
ImportError: No module named aufruf
Verzeichnisbaum:
  • \haupt
    script.py
    \haupt\gab
    __init__.py
    \haupt\gab\test
    __init__.py
    aufruf.py
Dann muss das folgende doch klappen!

Code: Alles auswählen

import gab.test.aufruf

# wie auch immer eine Funktion bei dir heißt.
gab.test.aufruf.funktion()
Gab
User
Beiträge: 21
Registriert: Montag 17. August 2009, 14:45

Es werden jeweils die __init__.py angegeben.

Was mich nun verwirrt:
Der Aufruf
xy = Gab.test
funktioniert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich habe das ganze mal eben lokal durchgespielt und diese Varianten funktionieren:

Code: Alles auswählen

from gab import test
from gab.test import aufruf
print test.aufruf.__file__
print aufruf.__file__ 
Diese Version hingegen funktioniert tatsächlich nicht, ein Verhalten mit dem ich micht noch nicht näher beschäftigt habe.

Code: Alles auswählen

import gab.test
print gab.test.aufruf.__file__
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, mir reicht's jetzt ;-)

Ich habe das auch mal lokal getestet:

Code: Alles auswählen

script.py
gab/
  __init__.py
  test/
    __init__.py
    bar.py
Mit der bar.py

Code: Alles auswählen

def foo():
	print "Toll!"
Und dann script.py

Code: Alles auswählen

import gab.test.bar

gab.test.bar.foo()
Als Ergebnis kommt natürlich das "Toll!".

Du machst def. etwas anders, als Du es hier angibst. Evtl. stimmt die __init__.py nicht? (Unterstrich vergessen?) Oder Dir fehlen Schreib- / Leserechte?
Gab
User
Beiträge: 21
Registriert: Montag 17. August 2009, 14:45

Welche Schreib-/Leserechte braucht es denn?

Die Scripterei liegt auf einem externen Laufwerk. Dort funzt es nicht. Wenn ich's lokal bei mir baue, funzst es!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gab hat geschrieben:Welche Schreib-/Leserechte braucht es denn?

Die Scripterei liegt auf einem externen Laufwerk. Dort funzt es nicht. Wenn ich's lokal bei mir baue, funzst es!
Das wäre natürlich mal eine wichtige Info gewesen :roll:

Naja, der Python-Interpreter muss Leserechte auf den Verzeichnissen haben. Das hat er offenbar nicht. Du kannst das ja mal testen mit den os / os.path Funktionen.
Antworten