Projekt Ordnerstruktur

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
m1LLo
User
Beiträge: 6
Registriert: Dienstag 8. Mai 2018, 15:51

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
m1LLo
User
Beiträge: 6
Registriert: Dienstag 8. Mai 2018, 15:51

Hallo Danke für eure Antworten.
Ich habe jetzt mal die Variante mit dem installieren per

Code: Alles auswählen

pip install -e .
genutzt. Da Paket wird auch installiert und in

Code: Alles auswählen

pip3 list
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.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten