Seite 1 von 1
Projekt Ordnerstruktur
Verfasst: Montag 13. Mai 2019, 13:51
von m1LLo
Hallo liebe Community,
ich versuche meinen Projektordner für meine Abschlussabeit etwas besser zu strukturieren.
Da mein Project noch keinen endgültigen Namen besitzt heißt es einfach
code .
Folgende Ordnerstruktur habe ich angestrebt.
Code: Alles auswählen
code
├── LICENSE.md
├── communication
│ ├── databaseCommunication.py
│ ├── messages
│ │ ├── TLSNMessage.py
│ │ ├── ZoneRequestMessage.py
│ │ ├── ZoneAssignMessage.py
│ │ └── __init__.py
│ ├── dataObject
│ │ ├── vector2D.py
│ │ ├── position.py
│ │ ├── __init__.py
│ ├── __init__.py
├── controller
│ ├── startpoint.py
│ ├── controller.py
│ ├── parser.py
├── server
│ ├── startpoint.py
│ ├── server.py
├── README.md
└── .gitignore
Sowohl der
controller als auch der
server brauchen Zugriff auf die in
communication definierten Nachrichten. Jetzt erlaubt Python ja keinen Import oberhalb des eigenen Pakets. Jetzt kann ich natürlich den Pfad zu
communication per
sys.append hinzufügen was jedoch folgende Nachteile bringt:
- Der Linter meldet eine Fehlermeldung da er das Modul nicht finden kann da es erst zur Laufzeit zur Verfügung steht
- VS Code kann durch den gleichenumstand keine Codevervollständigung bereitsstellen
Sowohl der Controller als auch der Server werden unabhängig von einander in Docker Containern laufen.
Wie organisiert Ihr euren Code dass er aufgabenspezifisch gekapselt aber die Module trotzdem dort zur Verfügung stehen wo sie gebraucht werden.
Beste Grüße und vielen Dank im Voraus.
m1LLo
Re: Projekt Ordnerstruktur
Verfasst: Montag 13. Mai 2019, 14:13
von Sirius3
Alles, was zu einem Projekt gehört, sollte in einem Paket sein, also alles noch eine Verzeichnisebene tiefer verschieben.
Module werden in Python klein_mit_unterstrich geschrieben, das solltest Du noch anpassen.
Die Namen der Python-Dateien lassen vermuten, dass Deine Module sehr kleinteilig sind (eine Klasse pro Datei?). Ich vermute alles was unter messages steht, sollte in einer Datei sein, ebenso dataObjekt, wobei der Modulname viel zu allgemein ist: alles in Python ist ein Objekt und Data ist im Prinzip auch alles.
`startpoint.py` hört sich fast so an, als ob Du eigentlich ein __main__.py haben möchtest, oder einen scripts-Ordner, in dem alle ausführbaren Python-Dateien gesammelt werden.
Re: Projekt Ordnerstruktur
Verfasst: Montag 13. Mai 2019, 14:17
von __blackjack__
@m1LLo: Installiere ordentlich und mache Dir dabei den Umstand zunutze, dass man Packages auch ”in place” installieren kann. Schau Dir mal die `-e`-Option von ``pip install`` an.
Re: Projekt Ordnerstruktur
Verfasst: Montag 13. Mai 2019, 15:56
von m1LLo
Hallo Danke für eure Antworten.
Ich habe jetzt mal die Variante mit dem installieren per
genutzt. Da Paket wird auch installiert und in
angezeigt. Aber weder die Entwicklungsumgebung noch der Interpreter finden das Paket.
Code: Alles auswählen
python -m site
sys.path = [
'/home/XXX/Projekte/abschlussarbeit',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/home/XXX/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/local/lib/python2.7/dist-packages/sumolib-1.1.0.690-py2.7.egg',
'/usr/local/lib/python2.7/dist-packages/traci-1.1.0.690-py2.7.egg',
'/usr/local/lib/python2.7/dist-packages/libsumo-1.1.0.690-py2.7.egg',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/wx-3.0-gtk3',
]
USER_BASE: '/home/XXX/.local' (exists)
USER_SITE: '/home/XXX/.local/lib/python2.7/site-packages' (exists)
ENABLE_USER_SITE: True
Mein Projekt sieht jetzt folgendermaßen aus.
Code: Alles auswählen
code
├── __init__.py
├── LICENSE
├── make_images.sh
├── README.md
├── src
│ ├── communication
│ │ ├── communication
│ │ │ ├── database_communication.py
│ │ │ ├── data_types.py
│ │ │ ├── __init__.py
│ │ │ └── messages.py
│ │ ├── setup.py
│ │ └── tlsiscommunication.egg-info
│ │ ├── dependency_links.txt
│ │ ├── PKG-INFO
│ │ ├── SOURCES.txt
│ │ └── top_level.txt
│ ├── __init__.py
│ ├── sonstiges
│ │ ├── car_simulation.py
│ │ └── input_validation.py
│ ├── zone
│ │ ├── collision_detecton.py
│ │ ├── data_receiver.py
│ │ ├── docker-compose_zone.yml
│ │ ├── dockerfile_data_receiver
│ │ ├── dockerfile_raw_db
│ │ ├── __init__.py
│ │ ├── requirements.txt
│ │ ├── zone_misc
│ │ │ └── db_schemata
│ │ │ ├── clean_db
│ │ │ └── raw_db
│ │ │ ├── 1create_tables.sql
│ │ │ └── 2insert_data.sql
│ │ └── zone.py
│ └── zone_controller
│ ├── controller_misc
│ │ ├── db_schemes
│ │ │ └── controller_db_schema.sql
│ │ └── muc.xml
│ ├── docker-compose_zone_controller.yml
│ ├── dockerfile_controller_db
│ ├── dockerfile_osm_parser
│ ├── __init__.py
│ ├── parse_osm.py
│ ├── parser_start.py
│ ├── requirements.txt
│ ├── standard_zone.py
│ └── zone_controller.py
└── tests
├── __init__.py
├── test_position.py
└── test_TLSMessage.py
Die __init__.py im communication Paket:
Code: Alles auswählen
import data_types
import database_communication
import messages
setup.py
Code: Alles auswählen
#!/usr/bin/env python3
"""
DESCRIPTION:
Package to provide communication modules like database, or objects for communication like vector2D
@file setup.py
@author XXX
@date 2019-05-13
@version Id$
"""
from setuptools import setup
setup(name='tlsiscommunication',
version='0.1',
description='coming soon',
author='XXX',
packages=['communication']
)
Also ich hatte noch in keiner Programmiersprache so viel Probleme bei der Projektorganisation.
Re: Projekt Ordnerstruktur
Verfasst: Montag 13. Mai 2019, 16:23
von __deets__
Das du munter Python 2.7 mit Python 3 mischst hat nun aber nix mit Pythons Organisiertheit oder dem Mangel daran zu tun. Und das wilde verstreuen von Paketen mit Setup.py, Paketen in Paketen und so weiter hast du dir auch selbst ausgedacht.
Toplevel gehört EIN setup.py. Darunter in vernünftigen Paketnamen der Code organisiert. Kein src. Keine weiteren setup.pys.
Wenn du mehrere Pakete willst, musst du ggf eben unterverzeichnisse einführen, aber dann auch mehrfach pip install ... aufrufen. Oder einfach unterpakete benutzen.