Seite 1 von 1

Packagestrukturen in python

Verfasst: Dienstag 12. Juli 2011, 18:08
von det
Hallo zusammen und einen schönen guten Abend,

ich bin sowohl python-Newbie als auch Foren-Newbie und bitte daher um Verständnis, wenn ich ein wenig unbeholfen wirke.

Zu meinem Problem:
Ich würde gerne meine Python-Projekte so ähnlich aufbauen, wie man das von Java her kennt. Im Grunde meine ich, dass das auch gehen sollte.
Zum Testen, wie man mit Package-Strukturen umgehen kann, wollte ich mir mal schnell einen rekursiven Renamer schreiben. Hierzu habe ich flg. Struktur angelegt:

Code: Alles auswählen

Src (Source-Stamm-Verzeichnis)
  -- base (Verzeichnis)
    ---- __init__.py (leer)
    ---- daClass.py
    ---- daBasePathVisitor.py (abgeleitet von daClass)
    ---- Ini.py
  -- filesystem (Verzeichnis)
    ---- __init__.py (leer)
    ---- daPathVisitor.py (abgeleitet von daBasePathVisitor)
    ---- daRecRenamer.py (abgeleitet von daPathVisitor)
rename.cmd (Batch zum Testen)
Zum „mal schnell“ Testen habe ich der Klasse daRecRenamer eine Main-Methode mit gegeben, über die eine Instanz der Klasse erzeugt wird und das Umbenennen von Dateien initiiert.

Starte ich mein Programm aus meiner Entwicklungsumgebung heraus (EasyEclipse for PythonVersion: 1.3.1Based on Eclipse build id: M20071023-1652, Interpreter Python 2.6) funktioniert das einwandfrei. Starte ich das Programm hingegen außerhalb meiner Entwicklungsumgebung via Kommandozeile (Batch nd auch python 2.6), bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "filesystem\daRecRenamer.py", line 2, in <module>
    from daPathVisitor import daPathVisitor
  File "C:\tmp\13045\src\filesystem\daPathVisitor.py", line 1, in <module>
    from base.daBasePathVisitor import daBasePathVisitor
ImportError: No module named base.daBasePathVisitor
Irgendwie verstehe ich nicht, wieso das innerhalb des Eclipses funktioniert und via Kommandozeile nicht. Was übersehen ich?

Vielen Dank im Voraus für eure Hilfe.

Re: Packagestrukturen in python

Verfasst: Dienstag 12. Juli 2011, 18:24
von BlackJack
@det: Du verschwendest damit im Grunde Pakete und Module. Wenn Du in Python programmierst, solltest Du die vorhandenen Strukturierungsmöglichkeiten auch benutzen. Module bündeln zusammengehörige Funktionen und Klassen und Pakete bündeln zusammengehörige Module.

Und man muss keine Klassen verwenden. Für einen Renamer sieht das da total ”over engineered” aus. Die Funktion `os.walk()` kennst Du schon?

Zur Fehlermeldung: ``base/`` (und ``filesystem/``) müssen gefunden werden können. Du hast das Skript wahrscheinlich *im* ``filesystem/``-Verzeichnis gestartet. Von da ist ``base/`` (normalerweise) nicht sichtbar. Starte mal vom ``Src/``-Verzeichnis aus. Das wird die IDE wahrscheinlich auch machen.

Re: Packagestrukturen in python

Verfasst: Dienstag 12. Juli 2011, 18:45
von det
Hallo BlackJack,

vielen Dank für die schnelle Antwort.
Ja, ich kenn os.walk() und mein im Visitor-Pattern aufgebauter Renamer soll ja nur als Beispiel für die Anwendung von Strukturmöglichkeiten in python dienen, für z.B. größere Projekte, bei denen man mit flachen Strukturen schnell den Überblick verliert....aber ich will nicht vom eigentlichen Thema ablenken.

Die Batchdatei startet von
src/
aus:

Code: Alles auswählen

python.exe filesystem\daRecRenamer.py parameter_1
Da die Main-Methode in der Klasse daRecRenamer implementiert ist, kann die Entwicklungsumgebung im Grunde auch nichts anderes machen, als diese im Verzeichnis filesystem\.. aufrufen. Oder habe ich dich vllt. falsch verstanden?

VG Det

Re: Packagestrukturen in python

Verfasst: Dienstag 12. Juli 2011, 19:43
von BlackJack
@det: Dein Beispiel wendet die Strukturmöglichkeiten von Python dann doch aber gar nicht an. Du verwendest Module und Pakete nicht so wie sie gedacht sind. Eine Klasse pro Modul ist nicht ”pythonisch” sondern eher Java in Python-Syntax. Was das verschachteln angeht sagt das Zen (``import this``): „Flat is better than nested.”

Eine ”pythonischere” Struktur wäre das hier:

Code: Alles auswählen

renamer/
    __init__.py
    base.py  (eventuell Inhalt dieses Moduls in ``__init__.py`` verschieben)
    filesystem.py
Man sollte auch immer bedenken, dass man Module auch noch aufteilen oder in Packages umwandeln kann, wenn sie *wirklich* zu unübersichtlich werden.

Den `ImportError` kann ich mir auch nicht erklären.