Inhalt⌗

Python⌗

Python ist eine Programmiersparche die für Skripte, Datananalyze und Maschinelles lernen intensive genutzt wird. Über dies hinaus kann sie auch für fast alle anderen Zwecke verwendet werden, jedoch wird sie in anderen Bereichen wohl kaum die richtige Wahl sein. Python ist simple und praktisch für Anfänger und das ist wohl auch der Grund warum Python so weit verbreitet ist. Darüber hinaus kommt Python mit vielen Problemen. Vielleicht ist Python sowas wie das C aber für dynamische Programmiersprachen. Es braucht 1000-Seitige Guidlines damit man sich nicht den grössten unmaintainable garbage zusammen schreibt.

Python Environement⌗

Das Problem des environments und welche version für das Skript genutzt werden soll, kommt bei Python daher, dass es so weit verbereitetet genutzt wird. Wenn wir dies besonders mit Python verbinden, dann weil dies schlechter macht wie andere Porgrammiersprachen, sondern weil Python ein umfangreicheres Packages system etc. hat. Package Versionen zu tracken un zu instalieren wird am besten von einem deklarativen dafür spezifizierten service gemacht. Aktuell scheint hier uv der Gold-Standard zu sein. uv ermöglicht das erstellen eines environements mit einem einfachen toml file und dazugehörigen command.

Zum Beispiel: pyproject.toml

[project]
name = "python-deeplearning"
version = "0.1.0"
description = "Deepl Learning environment for Exam managed by uv"
readme = "README.md"
requires-python = "==3.10.*"
dependencies = [
    "torch>=2.12.0",
    "torchvision>=0.27.0",
    "tqdm>=4.66.5",
    "ipython", 
    "pandas",
    "numpy",
    "scipy",
    "scikit-learn",
    "matplotlib",
    "jupyter",
    "ipympl",
    "pyqt6",
]

[[tool.uv.index]]
name = "pytorch-cuda"
url = "https://download.pytorch.org/whl/cu132"
explicit = true  # CRITICAL: Keeps PyPI as the default, only uses this index when pinned!

[tool.uv.sources]
torch = { index = "pytorch-cuda" }
torchvision = { index = "pytorch-cuda" }
tqdm = { index = "pytorch-cuda" }

und mit dem command:

uv sync

Wird das Environement installiert.

Anschliessend können python skripte mit dem Environement ausgeführt werden:

uv run <command>
uv run ipython

Python Projekt Struktur⌗

Nun wenn wir all unsere dependencies und libraries mit uv korrekt importiert haben können wir uns mit der Projektstruktur auseinandersetzen. Python erlaubt es mehrer Files zusammen zu fügen mit imports. Grundsätzlich kann zwischen import einer ganzen library und einer einzelnen Funktion unterschieden werden.

  1. import file/lib
  2. from file/lib import func
import math  # komplettes Modul importieren
print(math.pi)  # pi ist eine Konstante, keine Funktion


import matplotlib.pyplot as plt  # Alias; üblich für pyplot
plt.plot([1, 2, 3])


from math import pi  # nur ein Element importieren
print(pi)  # ebenfalls keine Funktion

Python ausführen⌗

Hier ist der absolute standard Jupyter. Aber hell nah we don’t touch that. Ich würde eher über IPython einer interaktiven Python session und einem source code file arbeiten. Das ermöglicht ein interaktiven Workflow ähnlich zu R. Die idee ist wir haben die Python REPL (Read eval print loop) welche unseren code ausführt. Wir können dann in unserem Editor selektiv auswählen welchen code dass wir ausführen wollen.

Setup (LINUX)

  1. erstellen einer Pipe (Nur auf UNIX systemen, es gibt warscheinlich bessere alternativen)
  2. IPython REPL in einem Kitty terminal mit Remote control öffnen
  3. Command der selektierten text ans terminal übermittelt
  • erstellen der pipe (einmal beim ersten setup)
mkfifo /tmp/repl
  • öffnen der REPL session mit remote control
kitty -o allow_remote_control=yes --listen-on unix:/tmp/repl --title repl
uv run ipython
  • Bash script für das übermitteln von selektiertem Text aus dem Editor echo "print('hi')" | ~/path/to/script python Da python mit dem Tab und Linienumbrüche Funktionen beendet ist in einigen situationen unklar ob eine Funktion beginnt oder endet. Daher haben wir diese spezielle symbole um den code die IPython angeben wo ein snippet startet und endet.

File: ~/path/to/script

#!/usr/bin/env bash

LANGUAGE=$1
CODE=$(cat)


CODE=printf '%s' "$CODE" | od -c

if [[ -z "$CODE" ]]; then
    exit 0
fi

if [[ "$LANGUAGE" == "python" ]]; then
    kitten @ --to unix:/tmp/repl send-text $'\x1b[200~'"$CODE"$'\x1b[201~\n\n'
else
    kitten @ --to unix:/tmp/repl send-text "$CODE
"
fi

Und weil wir noch Plotten wollen ein minimales setup für IPython plotting auf Wayland:

File: ~/.ipython/profile_default/startup/00-matplotlib.py

import IPython
try:
    # Safely attempt to initialize the Qt6 backend
    IPython.get_ipython().run_line_magic('matplotlib', 'qt6')
    print("IPython: Matplotlib Qt6 backend loaded successfully.")
except ImportError:
    # Silently pass if PyQt6 isn't installed in the active environment
    print("Consider importing pyqt6 if plots a rendered silently")
    pass
except Exception as e:
    # Catch any other weird initialization errors quietly
    print(f"IPython: Could not load interactive backend: {e}")