Python, venv und Dienste
Python 3 mit virtueller Umgebung und pip, und ein Bot oder Skript als systemd-Dienst.
4 Min. Lesezeit
Auf dieser Seite
Gilt für Debian 12/13, Ubuntu 22.04/24.04, AlmaLinux 9 und Rocky Linux 9. Am Ende läuft dein Python-Programm in einer eigenen Umgebung als Dienst, mit Logs im Journal.
1. Python installieren
Python 3 ist auf allen Systemen schon da. Es fehlen meist nur venv und pip.
Debian und Ubuntu:
apt install -y python3 python3-venv python3-pipAlmaLinux und Rocky Linux:
dnf install -y python3 python3-pipWelche Version du hast:
| System | python3 |
|---|---|
| Debian 12 | 3.11 |
| Debian 13 | 3.13 |
| Ubuntu 22.04 | 3.10 |
| Ubuntu 24.04 | 3.12 |
| AlmaLinux/Rocky 9 | 3.9 |
Braucht dein Programm auf AlmaLinux oder Rocky eine neuere Version, installier sie zusätzlich. python3 bleibt dabei 3.9, weil das System es braucht:
dnf install -y python3.12 python3.12-pipDann nimmst du überall unten python3.12 statt python3.
python3 --version2. Benutzer und Ordner
useradd --system --create-home --home-dir /opt/pybot --shell /usr/sbin/nologin pybotBring deinen Code nach /opt/pybot/app, per Git oder SFTP, und gib ihn dem Benutzer:
chown -R pybot:pybot /opt/pybot3. Virtuelle Umgebung und pip
Eine virtuelle Umgebung (venv) ist ein eigener Ordner mit Python und Paketen nur für dieses Programm. So kommen sich Programme nicht in die Quere, und du brauchst kein root für pip.
sudo -u pybot python3 -m venv /opt/pybot/venv
sudo -u pybot /opt/pybot/venv/bin/pip install --upgrade pip
sudo -u pybot /opt/pybot/venv/bin/pip install -r /opt/pybot/app/requirements.txtOhne requirements.txt installierst du Pakete einzeln, etwa …/pip install discord.py.
Zum Arbeiten von Hand aktivierst du die Umgebung:
source /opt/pybot/venv/bin/activate
python --version
deactivate4. Geheimnisse in eine Env-Datei
Tokens und Passwörter gehören nicht in den Code:
install -d -m 0750 /etc/pybot
nano /etc/pybot/pybot.envDISCORD_TOKEN=dein-tokenchmod 600 /etc/pybot/pybot.envIm Code:
import os
token = os.environ["DISCORD_TOKEN"]5. systemd-Dienst
nano /etc/systemd/system/pybot.service[Unit]
Description=Python-Bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=pybot
WorkingDirectory=/opt/pybot/app
EnvironmentFile=/etc/pybot/pybot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/pybot/venv/bin/python main.py
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.targetErsetz main.py durch deine Startdatei. PYTHONUNBUFFERED=1 sorgt dafür, dass print() sofort im Journal landet statt erst später.
systemctl daemon-reload
systemctl enable --now pybotEin Skript regelmäßig ausführen
Für ein Skript, das nicht dauerhaft läuft, sondern etwa stündlich, nimm einen Timer statt Restart. Im Dienst Type=oneshot setzen und Restart-Zeilen sowie [Install] weglassen, dann:
nano /etc/systemd/system/pybot.timer[Unit]
Description=Python-Skript stündlich
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.targetsystemctl daemon-reload
systemctl enable --now pybot.timer
systemctl list-timers pybot.timerPrüfen, ob es läuft
systemctl status pybot
journalctl -u pybot -factive (running) und deine Ausgaben im Journal. Strg+C beendet nur die Anzeige.
Aktualisieren
cd /opt/pybot/app
sudo -u pybot git pull
sudo -u pybot /opt/pybot/venv/bin/pip install -r requirements.txt
systemctl restart pybotNach einem Upgrade der Distribution auf eine neue Python-Version (etwa Debian 12 auf 13) die venv neu anlegen: Ordner löschen, Schritt 3 wiederholen.
Häufige Fehler
| Meldung | Ursache und Lösung |
|---|---|
error: externally-managed-environment | pip install ohne venv. Das System schützt seine eigenen Pakete. Nimm die venv aus Schritt 3. |
The virtual environment was not created successfully because ensurepip is not available | python3-venv fehlt (Debian/Ubuntu): apt install python3-venv. |
ModuleNotFoundError im Dienst, von Hand geht es | Der Dienst nutzt ein anderes Python. ExecStart muss auf /opt/pybot/venv/bin/python zeigen. |
status=203/EXEC | Pfad in ExecStart falsch oder venv fehlt. |
KeyError: 'DISCORD_TOKEN' | Variable fehlt in der Env-Datei oder EnvironmentFile ist falsch geschrieben. |
| Keine Ausgabe im Journal | PYTHONUNBUFFERED=1 fehlt. |
Wie es weitergeht
- Server absichern.
- Mehrere Dienste mit Datenbank: Docker.
- Hilfe: Ticket.