====== Snippets: Python ======
[[:snippets:start|← Zurück zu :snippets:start]]
===== Konfigurationsdateien lesen =====
==== INI-Dateien ====
Python enthält mit [[https://docs.python.org/3/library/configparser.html|configparser]] bereits von Haus aus Unterstützung zum lesen von Konfigurationsdateien im INI-Format.
Nachdem eine Instanz der Klasse ''configparser.ConfigParser'' erstellt wurde, muss nur noch mit ''load()'' die Konfigurationsdatei geladen werden. Danach kann die Parser-Instanz wie ein verschachteltes Dict benutzt werden.
Im folgenden Beispiel werden so die Zugangsdaten zu einer MySQL-Datenbank aus gelesen und eine Verbindung aufgebaut.
[APP]
DEBUG = False
[DATABASE]
HOST = 127.0.0.1
USER = root
PASSWORD = p@ssw0rd
DB = my_database
import configparser
import MYSQLdb
# Konfigurationsdatei lesen
config = configparser.ConfigParser()
config.read("config.ini")
# Der Parser wird wie ein Dict in einem Dict ausgelesen:
if config["APP"]["DEBUG"]:
print("Debug mode enabled")
db = MySQLdb.connect(
config["DATABASE"]["HOST"],
config["DATABASE"]["USER"],
config["DATABASE"]["PASSWORD"],
config["DATABASE"]["DB"]
)
db.close()
===== Skript inkl. Abhängigkeiten als ausführbare ZIP-Datei =====
> **Achtung!** Dieses Snippet ist nur eine Roh-Fassung und muss noch überarbeitet werden!
Mithilfe von Pythons [[https://docs.python.org/3/library/zipapp.html|zipapp-Modul]] lassen sich ausführbare ZIP-Archive erstellen, die ein Skript und alle seine Abhängigkeiten enthalten können.
Die erzeugte Datei ist ein ZIP-Archiv mit Shebang, und kann so auf jedem System ausgeführt werden, solange Python installiert ist (Was unter Unix/Linux meist der Fall ist).
Das folgende Skript erstellt eine zipapp für [[https://raw.githubusercontent.com/malte70/scripts/refs/heads/master/pushover-notify|pushover-notify]] (Teil meiner Skriptsammlung, sendet Benachrichtigungen über Pushover):
# Python zipapp for pushover-notify
cd "$(dirname $0)"
wget "https://raw.githubusercontent.com/malte70/scripts/refs/heads/master/pushover-notify"
echo '# requirements.txt
# for standalone pushover-notify zipapp
pushover @ git+https://github.com/Wyattjoh/pushover@5852545c5b9cf2717e1eafc4c8b134a08b0994da
toml==0.10.2
' > requirements_pushover_notify.txt
#
# Create pushover_notify package containing the script and
# all of it's dependencies
#
mkdir pushover_notify/
# Empty __init__.py
touch pushover_notify/__init__.py
# The script itself
cp pushover-notify pushover_notify/__main__.py
# requirements.txt
# (used later to install dependencies into the pushover_notify package)
mv requirements_pushover_notify.txt pushover_notify/requirements.txt
# Example config
echo '[pushover]
appname = "MyApp"
api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
user_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# Optional: Alternative apps
[app.foo]
appname = "Foo"
api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
' > pushover_notify/pushover-notify.toml
# Install external requirements
python -m pip install -r pushover_notify/requirements.txt --target pushover_notify/
# Clean up after pip
rm -rf pushover_notify/{__pycache__,bin,*.dist-info}
#
# Create a .pyz file from the module pushover_notify
#
python -m zipapp \
pushover_notify/ \
-p "/usr/bin/env python3" \
-o po-notify.pyz \
-c