Eigene Module importieren

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
sisu
User
Beiträge: 28
Registriert: Sonntag 14. November 2010, 12:02

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

Code: Alles auswählen

import DateiA.py
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).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Code: Alles auswählen

import spam
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
Das Leben ist wie ein Tennisball.
sisu
User
Beiträge: 28
Registriert: Sonntag 14. November 2010, 12:02

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

Code: Alles auswählen

import spam
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:

Code: Alles auswählen

__name__ = "spam"
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? :/
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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

Code: Alles auswählen

import spam
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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Haave hat geschrieben:

Code: Alles auswählen

__name__ = "spam"
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. :wink:
sisu
User
Beiträge: 28
Registriert: Sonntag 14. November 2010, 12:02

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

Code: Alles auswählen

import os
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
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.
sisu
User
Beiträge: 28
Registriert: Sonntag 14. November 2010, 12:02

Ahhh, so funktioniert das!

Vielen Dank für diesen Tipp, jetzt kann ich endlich dynamischer testen ^^
Antworten