funktionen in andere datei auslagen und wieder aufrufen

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
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Mein Python skript ist nun sehr unübersichtlich geworden, deswegen habe ich mir gedacht alle Funktionen in seperate Dateien auszugliedern:

nun habe ich mehrere Funktionen in einzelne Dateien in den Ordner funktionen kopiert.

folgender Code ist in einer dieser Dateien (test1.py) als Beispiel

Code: Alles auswählen

def test1
print "test"
Aufrufen möchte ich diese Funktion mit folgendem Schritt

Code: Alles auswählen

import sys
import os
fpath= "funktionen/"
sys.path.append(os.path.abspath(fpath))
import test1
Leider funktioniert dies so nicht was mache ich falsch?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@sbfly: befindet sich der Ordner funktionen wirklich im aktuellen Verzeichnis, also nicht das Verzeichnis in dem Dein Hauptprogramm liegt, sondern dem Verzeichnis von dem Du das Skript gestartet hast?

Wie Du das beschreibst, hört es sich an, als ob Du die Unübersichtlichkeit in einer Datei durch die Unübersichtlichkeit von vielen Dateien ersetzt hast. Normalerweise fast man mehrere Funktionen zu Modulen zusammen. Wenn es wirklich sinn macht, mehrere Module zu haben, dann werden diese Module in ein Paket zusammengefasst. Dieses Paket wird installiert und nicht dadurch verfügbar gemacht, dass man sys.path innerhalb des Hauptprogramms manipuliert.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

mein code hat ca. 2000 Zeilen
dies möchte ich in 3 Dateien ausgliedern


leider muss ich das programm aus unterschiedlichen Verzeichnissen Starten können :-(

das mit den Paketen habe ich mir auch schon angeschaut
leider nicht so ganz verstanden

ich erstelle einen Ordner z.B. Funktionen

in diesem Ordner liegen z.b. drei Dateien + einen Datei __init__.py

wie kann ich das paket den nun einladen ?

was macht die init datei wenn sie leer sein darf ?
BlackJack

@sbfly: Programme aus unterschiedlichen Verzeichnissen starten zu können ist normal, da muss man nicht ”leider” zu sagen. ;-)

Der Ordner in dem der Ordner mit dem Package liegt muss im Suchpfad für Module liegen. Und dann kann man die Module aus dem Package ganz normal importieren über das Package, also Beispielsweise ``from Funktionen import spam`` um das `spam`-Modul aus dem `Funktionen`-Package zu importieren.

Mir ist klar das `Funktionen` hier nur ein Beispiel war, aber bei dem Namen des ”Wurzelpakets” sollte man einen sinnvollen und nicht zu generischen Namen wählen, denn das befindet sich ja auf ”oberster Ebene” und teilt sich diesen Namensraum mit allen anderen installierten Modulen und Paketen. Da sollte man auf Namenskollisionen achten.

Die `__init__.py` macht den Ordner zu einem Package. Irgendwie muss Python ja Ordner unterscheiden in denen einfach nur zufällig ein paar Python-Dateien liegen und Ordner die ein Package bilden sollen. Ausserdem kann man das Package selber ja auch als Modul importieren (``import Funktionen`` oder ``from Funktionen import …``) und dann braucht man ja einen Ort wo man den Quelltext hinein schreiben kann der dieses Modulobjekt definiert. Insofern könntest Du auch überlegen ob Du das Modul in drei Module aufteilen möchtest, oder vielleicht nur in zwei plus dem bisher ungenutzen Package-Modul.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das nachträgliche Aufteilen eines Moduls führt auch gerne mal zu Kopfschmerzen in Hinblick auf die gegenseitigen Abhängigkeiten der einzelnen Codeteile. Natürlich ist es einerseits verlockend, ein umfangreiches Modul zu verschlanken. Andererseits hat man aber auch die Gefahr zirkulärer Importe, welche in Python zu einer Exception führen, d.h. nicht unterstützt werden. Dann kann man sich nur mit umständlichen Verrenkungen helfen oder indem man einige Abstriche von der eigentlich geplanten Aufteilung macht.

So zumindest sind meine bisherigen Erfahrungen mit dem Thema. Module sollten halt möglichst in sich geschlossene Teilsysteme sein. Oder eben höherwertige Schichten, bei denen garantiert ist, dass die untere Schicht nichts von der oberen Schicht wissen muss. Die Abhängigkeit darf also immer nur in eine Richtung zeigen. Und über sowas macht man sich IMHO vorher Gedanken. Einen solchen Entwurf nachträglich zu ändern, erfordert meistens einiges an Refactoring. Da würde ich mir gut überlegen, ob der Nutzen den Aufwand wert ist.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

vielen dank für die informationen
Antworten