Wie Sourcen aufteilen und "exe" verteilen bei großen Projekten

24/11/2007 - 18:18 von Andreas Bruhn | Report spam
Hi allerseits,

über die Ver- bzw. Aufteilung von "nicht-Quellcode"-Dateien wurde hier
ja schon diskutiert. Nun möchte ich mal mit zwei Fragen eine
Diskussion über 'Aufteilung von Quellcode beim Entwickler' bzw.
'Aufteilung von übersetzten Quellcode-Dateien (als *.pyc, *.pyo,
*.exe, *.dll, (*.so) oder wie auch immer) beim Kunden' starten.

(Wobei ich nicht sicher bin ob dafür ein oder zwei Threads besser
wàren. Schauen wir mal wie sich das entwickelt...)

Zum ersten die Aufteilung der Sourcen bei größeren Projekten. Solange
der ganze Projektcode in einer *.py-Datei ist, ist die Frage nicht
relevant. Habe ich auch schon gemacht, aber die Anwendung hat auch nur
"Datei einlesen -> Daten verarbeiten -> Datei schreiben" gemacht und
wurde in er Kommandozeile aufgerufen. Da gab es nicht die ganzen
zusàtzlichen Dateien und Codezeilen die durch die GUI hinzukommen.

Aber irgendwann (nicht nur z.B. mit einer GUI) wird mir das doch zu
unübersichtlich und dann teile ich das Ganze lieber etwas auf. Nicht
jede einzelne Klasse in einer getrennten Datei, aber zusammen
gehöriges (z.B. mehrere Klassen, Funktionen, Prozeduren oder so) in
einer Datei.

Das führt dann aber zu einen ganzen Haufen Dateien, die mir dann in
nur einem Verzeichnis auch wieder zu unübersichtlich werden. Nicht
ohne Grund gibt es ja packages bei Python.

Ich habe jetzt mal wieder ein privates Projekt gestartet und weil es
möglicherweise größer wird mit folgender Struktur begonnen:

\projektname\
\daten\datenbankdatei.fs
\python\projektname_gui.py
projektname_gui.cfg
(projektname_web.py)
\module\alpha.py
win_gui.py
(web_gui.py)
omega.py
\ein_package\__init__.py
datei1.py
datei2.py
\tests\unittest_alpha.py
unittest_omega.py


In den Verzeichnis 'daten' sollen die Datenbank-Datei(en) landen. Im
'python'-Verzeichnis liegen die Sourcen und vermutlich kommen auf der
Ebene spàter noch Verzeichnisse wie 'texte' oder 'html' hinzu.

Im Verzeichnis 'python' liegen dann die Dateien (eine *.py und evntl.
eine *.cfg) zum starten der Anwendung und das 'module'-Verzeichniss
mit den ganzen Sourcen. Hübsch aufgeràumt und übersichtlich.

Die eigentliche Datei zum starten der Anwendung (mit GUI) ist dann
'projektname_gui.py' und dort soll dann nicht viel mehr als folgendes
drinstehen:

- Verzeichnis `module` zum Suchpfad hinzufügen
- import win_gui
- win_gui.start()

Falls ich mir mal eine Web-GUI für die Anwendung ausdenke, dann gilt
das obige entsprechende für web statt gui.

Eine andere Möglichkeit wàre aus dem module-Verzeichnis auch schon ein
Package zu machen (damit wird dann 'ein_package' zu einem Subpackage)

\module\__init__.py
alpha.py
\ein_package\__init__.py
datei1.py
datei2.py

und wenn ich das jetzt richtig verstehe, dann wird aus dem obigen
'projektname_gui.py' dann:

- import module.win_gui
- module.win_gui.start()


eine andere Möglichkeit die mir eben einfiel:

\python\projektname_gui.py
projektname_gui.cfg
(projektname_web.py)
\gui_package\__init__.py
win_gui.py
(\web_package\__init__.py
web_gui.py)
\modul_Package\__init__.py
alpha.py
omega.py
\ein_package\__init__.py
datei1.py
datei2.py


Also auf das zentrale 'module'-Verzeichnis/Package verzichten und
alles in Packages eine Ebene höher ziehen. Damit ist das Verzeichnis
'python' dann aber nicht mehr so hübsch aufgeràumt und übersichtlich.

Damit habe ich schon mal drei verschiedene Möglichkeiten. Wie macht
ihr das? Gibt es irgendwelche Erfahrungswerte? Und wohin mit den
Unit-Tests und wie die anderen Module von dort aus importieren.

So, das wàre das erste. Nun der zweite Teil: Eine größere
Client/Server-Anwendung (z.B. ein Warenwirtschaftssystem) liegt beim
Kundne mit der Datenbank auf jeden Fall auf dem Server, aber was ist
mit dem Rest? Die ganzen Fenster und Dialoge mit denen auf die
Datenbank zugegriffen wird. Wohin und wie nutzen? Wenn die WAWI (mit
Wareneingang, Warenausgang, Auftragsverwaltung, Bestellungen,
Stammdaten, FiBu, Lagerverwaltung, ...) so aus rund 30-50 Fenstern
bzw. Dialogen besteht und dann die Anforderungen vom Kunden kommen:
"Kreditkartennummern sollen, in den beiden Fenstern in denen sie
angezeigt werden, jetzt mit eingefügten Leerzeichen dargestellt
werden. Vorher wurden sie ohne Leerzeichen angezeigt, so wie sie auch
weiterhin eingegeben und gespeichert werden." oder "Fenster XYZ soll
einen zusàtzlichen Menüpunkt und Button bekommen mit der die neue
Funktion ZYX aufgerufen werden kann."

Wie organisiert und installiert man die Anwendung, damit sich solche
Änderungen möglichst unkompliziert beim Kunden einspielen lassen?

Ich hàtte da schon einen Vorschlag aus eigener Erfahrung, den ich aber
noch nicht verraten möchte. Zum einen sind diese Anwendungen nicht mit
Python entwickelt, zum anderen vor rund 15-20 Jahren entstanden und
nicht von mir. Aber wie macht man das heutzutage und wie mit Python?
Vermutlich wàre ein Web-Interface eine mögliche Lösung, vermutlich
gibt es auch noch andere...

Der Grund weswegen ich erstmal beide Fragen in ein Posting schreibe:
Mein neues Projekt (oben aus dem ersten Teil) ist nicht als
Client-/Serveranwendung gedacht, aber wie organisiert man sich am
besten die Quelltexte z.B. für solch eine Warenwirtschaft? Da gibt es
ja dann viel GUI-Code (hauptsàchlich für die Clients), viel Code für
den Server (Datenbank betreffend und anderes) und zum dritten auch
noch viel Code der von beiden Teilen genutzt wird.


So, ich hoffe auf eine interessante Diskussion.

Andreas
 

Lesen sie die antworten

#1 Marc BlackJack Rintsch
25/11/2007 - 08:19 | Warnen spam
On Sat, 24 Nov 2007 18:18:44 +0100, Andreas Bruhn wrote:

Eine andere Möglichkeit wàre aus dem module-Verzeichnis auch schon ein
Package zu machen (damit wird dann 'ein_package' zu einem Subpackage)

\module\__init__.py
alpha.py
\ein_package\__init__.py
datei1.py
datei2.py

und wenn ich das jetzt richtig verstehe, dann wird aus dem obigen
'projektname_gui.py' dann:

- import module.win_gui
- module.win_gui.start()



So würde ich das machen. `module` dann aber auch irgendwie
projektspezifisch benennen also zum Beispiel `projektname`. Zumindest
unter Linux/Unix ist es dann üblich/möglich das Startskript systemweit in
`/usr/bin/` oder `/usr/local/bin/` zu installieren und das Package unter
`/.../site-packages/` wo auch die ganzen anderen Python-Pakete und -Module
von Drittanbietern landen.

Ciao,
Marc 'BlackJack' Rintsch

Ähnliche fragen