generated from realAscot/template-python
253 lines
7.3 KiB
Markdown
253 lines
7.3 KiB
Markdown
|
# Python Bootstrap-Template mit `.venv`- und `.env` Support
|
|||
|
|
|||
|

|
|||
|
|
|||
|
Dieses Template nutzt PEP 8, Type Hints, Docstrings und einen vordefinierten Workspace für sauberen Python-Code.
|
|||
|
Außerdem bietet es ein portables Start-Template für Python-Anwendungen mit folgenden Features:
|
|||
|
|
|||
|
- Automatische Erstellung einer virtuellen Umgebung (`.venv`)
|
|||
|
- Automatische Installation von Abhängigkeiten aus `requirements.txt`
|
|||
|
- Automatischer Neustart in der virtuellen Umgebung
|
|||
|
- Unterstützung von Umgebungsvariablen über eine `.env`-Datei
|
|||
|
- Sauberer Einstiegspunkt über `run.py`
|
|||
|
- Keine systemweiten Python-Pakete notwendig
|
|||
|
- Logging-Utils bereits integriert
|
|||
|
|
|||
|
Das Template ist durchdacht, pragmatisch und stark auf Entwicklerkomfort ausgelegt.
|
|||
|
Es bietet eine sehr gute Grundlage für Projekte aller Art – insbesondere CLI-Tools, kleine Services und lokale Anwendungen. Die automatische Einrichtung der virtuellen Umgebung hebt es funktional deutlich von Standard-Vorlagen ab.
|
|||
|
|
|||
|
**Was dieses template __nicht__ ist:**
|
|||
|
|
|||
|
- [ ] [pep-518](https://peps.python.org/pep-0518/)-konform 🚫
|
|||
|
|
|||
|
> ⚠️ Dieses Template verfolgt kein komplexes Build-System.
|
|||
|
Es ist dafür gedacht, dir in Sekunden eine saubere, gekapselte Python-Umgebung bereitzustellen – perfekt zum schnellen Testen, Debuggen oder Projektstart.
|
|||
|
Einfach deinen Code in main.py werfen, bei Bedarf requirements.txt anpassen, run.py starten – fertig. Kein Setup-Wahnsinn, kein Overhead.
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🔜 Inhalt der Readme
|
|||
|
|
|||
|
- [Python Bootstrap-Template mit `.venv`- und `.env` Support](#python-bootstrap-template-mit-venv--und-env-support)
|
|||
|
- [🔜 Inhalt der Readme](#-inhalt-der-readme)
|
|||
|
- [🔧 Projektstruktur](#-projektstruktur)
|
|||
|
- [🚀 Erste Schritte](#-erste-schritte)
|
|||
|
- [Beim ersten Start passiert:](#beim-ersten-start-passiert)
|
|||
|
- [📦 Abhängigkeiten](#-abhängigkeiten)
|
|||
|
- [⚙️ .env-Datei (optional)](#️-env-datei-optional)
|
|||
|
- [📜 Beispielausgabe](#-beispielausgabe)
|
|||
|
- [🪵 Logging](#-logging)
|
|||
|
- [🔧 Konfiguration (in `.env`)](#-konfiguration-in-env)
|
|||
|
- [📥 Beispielausgabe](#-beispielausgabe-1)
|
|||
|
- [📌 Logik im Code](#-logik-im-code)
|
|||
|
- [📁 Logrotation](#-logrotation)
|
|||
|
- [🛠 Hinweise](#-hinweise)
|
|||
|
- [🧪 Getestet mit](#-getestet-mit)
|
|||
|
- [🛠 Einsatz von `Linter` (`pylint`)](#-einsatz-von-linter-pylint)
|
|||
|
- [📁 Lizenz](#-lizenz)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🔧 Projektstruktur
|
|||
|
|
|||
|
```plaintext
|
|||
|
|
|||
|
📁 template-root/
|
|||
|
├── 📁 .vscode/ # Projekteinstellungen VS-Code
|
|||
|
│ ├── 📄 settings.json # Einstellungen
|
|||
|
│ └── 📄 extensions.json # Erweiterungen
|
|||
|
├── 📄 .env # Projektkonfiguration (optional, nicht im git)
|
|||
|
├── 📄 .env.example # Vorlage der .env
|
|||
|
├── 📄 requirements.txt # Abhängigkeiten (z.B. python-dotenv)
|
|||
|
├── 📄 README.md # diese Datei
|
|||
|
├── 📄 CHANGELOG.md #
|
|||
|
├── 📄 VERSION # Versionsinfo zum Paket
|
|||
|
├── 📄 run.py # Einstiegspunkt für die Anwendung
|
|||
|
├── 📁 media/
|
|||
|
│ └── 📄 logo.png # Logo für GitHub
|
|||
|
└── 📁 app/
|
|||
|
├── 📄 __init__.py #
|
|||
|
├── 📄 main.py # Hauptlogik der Anwendung
|
|||
|
└── 📄 bootstrap.py # Setup- und Relaunch-Logik
|
|||
|
```
|
|||
|
|
|||
|
> Release-Pakete als `.zip` sind bereits von unötigem Balast bereinigt. Die dargestellte Struktur entspricht einem `git clone`.
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🚀 Erste Schritte
|
|||
|
|
|||
|
- [ ] `.env.example` in `.env` umbenennen und individuell befüllen.
|
|||
|
- [ ] `.vscode`-Verzeichnis löschen, wenn du eigene Einstellungen nutzt. Ich habe es versehentlich committet und aus Bequemlichkeit drin gelassen, weil es meinem Standard entspicht.
|
|||
|
- [ ] `requirements.txt` auf deine Bedürfnisse anpassen.
|
|||
|
- [ ] `media/`Verzeichnis Löschen falls vorhanden.
|
|||
|
|
|||
|
**Erster Start des Templates:**
|
|||
|
|
|||
|
```bash
|
|||
|
python run.py
|
|||
|
```
|
|||
|
|
|||
|
### Beim ersten Start passiert:
|
|||
|
|
|||
|
1. `.venv` wird erstellt (wenn noch nicht vorhanden)
|
|||
|
2. `requirements.txt` wird installiert
|
|||
|
3. Das Skript wird automatisch innerhalb der venv neu gestartet
|
|||
|
4. `.env` wird geladen (falls vorhanden)
|
|||
|
5. **Die App startet 🚀**
|
|||
|
|
|||
|
> Es erfolgen einige Ausgaben, die alle aus der `main.py` stammen, außer du `DEBUG` in der `.env` aktiviert hast.
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 📦 Abhängigkeiten
|
|||
|
|
|||
|
Alle Abhängigkeiten werden aus `requirements.txt` installiert.
|
|||
|
**Beispiel:**
|
|||
|
|
|||
|
```text
|
|||
|
python-dotenv
|
|||
|
```
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## ⚙️ .env-Datei (optional)
|
|||
|
|
|||
|
Wenn vorhanden, wird `.env` automatisch geladen.
|
|||
|
**Beispiel:**
|
|||
|
|
|||
|
```dotenv
|
|||
|
APP_MODE=development
|
|||
|
LOGLEVEL=debug
|
|||
|
PORT=8080
|
|||
|
```
|
|||
|
|
|||
|
Diese Werte sind im Code über `os.getenv("APP_MODE")` verfügbar.
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 📜 Beispielausgabe
|
|||
|
|
|||
|
```text
|
|||
|
[BOOTSTRAP] Erstelle virtuelle Umgebung...
|
|||
|
[BOOTSTRAP] Installiere pip + requirements.txt...
|
|||
|
[BOOTSTRAP] Starte in virtueller Umgebung neu...
|
|||
|
[RUN] Lade .env aus: ./cliqrcode/.env
|
|||
|
[APP] Starte Anwendung im Modus: development
|
|||
|
[APP] Hello, world!
|
|||
|
```
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🪵 Logging
|
|||
|
|
|||
|
Dieses Template verwendet ein integriertes Logging-Modul mit folgenden Eigenschaften:
|
|||
|
|
|||
|
- Ausgabe in die Konsole (immer aktiv)
|
|||
|
- Optionale Ausgabe in eine Logdatei (`LOGFILE`)
|
|||
|
- Unterstützung für rotierende Logdateien
|
|||
|
- Loglevel konfigurierbar über `.env`
|
|||
|
- Plattformunabhängig (Windows, Linux, macOS)
|
|||
|
- Keine externen Abhängigkeiten
|
|||
|
|
|||
|
### 🔧 Konfiguration (in `.env`)
|
|||
|
|
|||
|
```dotenv
|
|||
|
LOGLEVEL=INFO # Möglich: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|||
|
LOGFILE=logs/app.log # Optionaler Pfad zur Logdatei (relativ oder absolut)
|
|||
|
```
|
|||
|
|
|||
|
> Wenn `LOGFILE` nicht gesetzt ist, wird nur in die Konsole geloggt.
|
|||
|
|
|||
|
### 📥 Beispielausgabe
|
|||
|
|
|||
|
```bash
|
|||
|
[2025-04-23 14:10:00] INFO app.main: Template ready.
|
|||
|
[2025-04-23 14:10:00] DEBUG app.main: Dies ist eine Debug-Meldung.
|
|||
|
```
|
|||
|
|
|||
|
### 📌 Logik im Code
|
|||
|
|
|||
|
In beliebigen Modulen kannst du so einen Logger verwenden:
|
|||
|
|
|||
|
```python
|
|||
|
from app.logging_utils import get_logger
|
|||
|
|
|||
|
log = get_logger(__name__)
|
|||
|
log.info("Template ready.")
|
|||
|
```
|
|||
|
|
|||
|
### 📁 Logrotation
|
|||
|
|
|||
|
Die Logdatei wird bei 1 MB automatisch rotiert (max. 3 Backups), z. B.:
|
|||
|
|
|||
|
```bash
|
|||
|
logs/app.log
|
|||
|
logs/app.log.1
|
|||
|
logs/app.log.2
|
|||
|
```
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🛠 Hinweise
|
|||
|
|
|||
|
- Das Template ist portabel und benötigt keine global installierten Pakete.
|
|||
|
- Du kannst es für jede neue App wiederverwenden.
|
|||
|
- `run.py` ist der einzige Einstiegspunkt – keine direkten Aufrufe von `main.py`.
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🧪 Getestet mit
|
|||
|
|
|||
|
- Python 3.11, 3.12, 3.13
|
|||
|
- Windows & Linux
|
|||
|
- VS Code, Terminal, PowerShell
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 🛠 Einsatz von `Linter` (`pylint`)
|
|||
|
|
|||
|
```cmd
|
|||
|
PS C:\Users\adams\Documents\template> .\.venv\Scripts\activate
|
|||
|
```
|
|||
|
|
|||
|
```cmd
|
|||
|
(.venv) PS C:\Users\adams\Documents\template> pylint.exe run.py
|
|||
|
```
|
|||
|
|
|||
|
```cmd
|
|||
|
************* Module run
|
|||
|
run.py:27:4: C0412: Imports from package app are not grouped (ungrouped-imports)
|
|||
|
run.py:12:0: W0611: Unused import os (unused-import)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
Your code has been rated at 8.33/10
|
|||
|
```
|
|||
|
|
|||
|
**Bonus:**
|
|||
|
Durch den Einsatz der <.vscode/task.json> für VS-Code, kannst du in VS-Code mit `Strg + Umschalt + P` → `Tasks: Run Task` → `Linter (pylint)` oder `Typprüfung (mypy)` aufrufen.
|
|||
|
|
|||
|
[🔝](#-inhalt-der-readme)
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
## 📁 Lizenz
|
|||
|
|
|||
|
MIT – frei verwendbar in eigenen Projekten.
|