Seite 1 von 1
Eigene Module importieren
Verfasst: Montag 22. November 2010, 23:28
von sisu
Hallo,
ich bin neu hier im Forum und beschäftige mich seit ein paar Wochen mit Python, weil ich nach Java gern eine neue Programmiersprache in Angriff nehmen wollte. Bin also ein wenig Java-vorgeschädigt/-verwöhnt (wie man das eben sehen möchte), aber vielleicht hilft euch das ja auch zu verstehen, wo bei mir die ein oder andere Denkstruktur herkommt. Nämlich z.B. bei folgendem Problem:
Ich habe drei py-Dateien (alle im selben Verzeichnis), zwei davon beinhalten Funktionen (verwende momentan noch keine eigenen Klassen), die dritte soll eine Art "Main-Funktion" sein und dazu dienen, die Funktionen aus den beiden anderen Dateien aufzurufen. Bloß: Wie funktioniert das? Muss ich die beiden Funktionendateien mit "import" in das Main-Modul holen? Ein Konstrukt wie
funktioniert nicht, dann kommt die Fehlermeldung "IndentationError: expected an indented block" bzw. bei Anführungsstrichen um den Dateinamen "SyntaxError: invalid syntax", und auch ohne die Endung .py geht es nicht. Aber ohne import einfach so benutzen (über den Datei-/Modulnamen) lassen sich die Funktionen auch nicht, dann erhalte ich "'NameError: name 'DateiA' is not defined".
Wahrscheinlich habe ich etwas Grundlegendes nicht verstanden, darum wäre ich froh, wenn mir jemand aufzeigen könnte, wie es richtig geht (oder ob das von mir Probierte vielleicht sogar nur im Zusammenhang mit Klassen funktioniert).
Re: Eigene Module importieren
Verfasst: Montag 22. November 2010, 23:51
von EyDu
Hallo und willkommen im Forum!
Wenn du ein Modul in der Datei "spam.py" hast, und du möchtest es in einem anderem Modul importieren, dann genügt ein
Den "IndentationError" bekommst du wahrscheinlich aus dem importierten Modul (daher solltest du hier auch immer den kompletten Traceback zeigen und nicht einfach nur deinen Fehler beschreiben). Deshalb kann das Modul nicht importiert werden und du bekommst einen "NameError".
Von deiner Aufteilung in diverse Dateien solltest du allerdings schnell wieder wegkommen. Module sind dazu da, um zusammengehörige Teile in einer Datei zusammenzufassen. Eine Aufteilung ist nur dann sinnvoll, wenn eine Modul auch ohne die anderen eine sinnvolle arbeit liefert. Im Gegensatz zu Java ist es ausdrücklich erwünscht, dass mehrere Funktionen und Klassen in der selben Datei stehen.
Bis dann,
Sebastian
Re: Eigene Module importieren
Verfasst: Freitag 26. November 2010, 12:46
von sisu
EyDu hat geschrieben:Hallo und willkommen im Forum!
Hallo
EyDu hat geschrieben:Wenn du ein Modul in der Datei "spam.py" hast, und du möchtest es in einem anderem Modul importieren, dann genügt ein
Wo müsste dann die py-Datei liegen, in die ich spam importieren will? Im selben Verzeichnis? Und wie mache ich überhaupt klar, dass ein Modul spam heißt? Wird das durch den Namen der Datei festgelegt? In Java muss die Quellcodedatei ja heißen wie die public class, die sich in ihr befindet. Allerdings bin ich auch schon über das Builtin-Feld __name__ gestolpert, müsste ich dann also schreiben:
um dafür zu sorgen, dass das Modul spam heißt?
EyDu hat geschrieben:Von deiner Aufteilung in diverse Dateien solltest du allerdings schnell wieder wegkommen. Module sind dazu da, um zusammengehörige Teile in einer Datei zusammenzufassen. Eine Aufteilung ist nur dann sinnvoll, wenn eine Modul auch ohne die anderen eine sinnvolle arbeit liefert. Im Gegensatz zu Java ist es ausdrücklich erwünscht, dass mehrere Funktionen und Klassen in der selben Datei stehen.
Okay, da muss ich mich wohl dran gewöhnen. Führt das nicht teilweise zu ziemlich langen Quellcodedateien? :/
Re: Eigene Module importieren
Verfasst: Freitag 26. November 2010, 13:13
von nomnom
Haave hat geschrieben:EyDu hat geschrieben:Hallo und willkommen im Forum!
Hallo
EyDu hat geschrieben:Wenn du ein Modul in der Datei "spam.py" hast, und du möchtest es in einem anderem Modul importieren, dann genügt ein
Wo müsste dann die py-Datei liegen, in die ich spam importieren will? Im selben Verzeichnis? Und wie mache ich überhaupt klar, dass ein Modul spam heißt? Wird das durch den Namen der Datei festgelegt?
Ja, das Python-Skript muss im selben Verzeichnis liegen und der Name wird durch den Dateinamen festgelegt. Und in dem Modul müssen auch keine Klassen vorhanden sein

Könnte auch nur eine Variable enthalten, aber das wäre ja (in den meisten Fällen) Unsinn
EDIT: Das Skript
muss nicht im selben Verzeichnis liegen, sorry. Du könntest das Skript auch in ein Verzeichnis ablegen, das zum Python-Path gehört. In diesem Python-Path stehen die Verzeichnisse in denen zuerst nach Modulen zu suchen ist. Aber das brauchst du nicht.
Re: Eigene Module importieren
Verfasst: Freitag 26. November 2010, 14:43
von mkesper
Haave hat geschrieben:
um dafür zu sorgen, dass das Modul spam heißt?
Nein, __name__ ist dafür da, um zu unterscheiden, ob der Code direkt ausgeführt wird oder von einem anderen Modul importiert wird.
Es ist Usus, die Module so zu strukturieren:
Code: Alles auswählen
def main():
tuwas...
if __name__ == '__main__':
main()
Dann wird main ausgeführt, wenn ich das Skript direkt starte, aber nicht beim Import. Abgesehen von den import-Statements sollte das auch der einzige Code direkt auf Moduleebene, also weder in einer Funktion noch Klasse, sein. Alles andere wird schnell zu Spaghetti.
Haave hat geschrieben:EyDu hat geschrieben:Im Gegensatz zu Java ist es ausdrücklich erwünscht, dass mehrere Funktionen und Klassen in der selben Datei stehen.
Okay, da muss ich mich wohl dran gewöhnen. Führt das nicht teilweise zu ziemlich langen Quellcodedateien? :/
Nicht im Gegensatz zu Java-Code.

Re: Eigene Module importieren
Verfasst: Montag 6. Dezember 2010, 10:41
von sisu
Ich habe nochmal eine Frage, fast das gleiche Thema, diesmal allerdings bezogen auf den Interpreter:
Wie kann ich ein eigenes Modul in den Interpreter importieren, so dass ich es "live" benutzen kann? Wenn es um die Python-Bibliothek geht, reicht ja
und dergleichen, aber was, wenn es eine py-Datei in meinem Home-Verzeichnis ist? Egal wie ich es versuche (Pfadname als String, Dateiname mit und ohne .py), er spuckt immer nur Invalid Syntax aus…
Code: Alles auswählen
>>> import '/home/haave/testprog.py'
File "<stdin>", line 1
import '/home/haave/testprog.py'
^
SyntaxError: invalid syntax
Re: Eigene Module importieren
Verfasst: Montag 6. Dezember 2010, 10:51
von BlackJack
@Haave: Das geht genau wie in Modulen auch mit ``import testprog``. Dazu muss der Pfad in `sys.path` liegen. Das aktuelle Arbeitsverzeichnis ist dort in aller Regel enthalten, also muss man da auch nichts ändern, wenn man den Interpreter im gleichen Verzeichnis startet, in dem auch die Module liegen, die man importieren möchte.
Re: Eigene Module importieren
Verfasst: Montag 6. Dezember 2010, 10:54
von sisu
Ahhh, so funktioniert das!
Vielen Dank für diesen Tipp, jetzt kann ich endlich dynamischer testen ^^