Python-Skripte einfach ausführen: uv und PEP 723
Dieser Blogartikel wurde automatisch erstellt (und übersetzt). Er basiert auf dem folgenden Original, das ich für die Veröffentlichung auf diesem Blog ausgewählt habe:
Fun with uv and PEP 723.
Die Ausführung von Python-Skripten gestaltete sich oft umständlich, da stets sichergestellt werden musste, dass die korrekte Python-Version und alle Abhängigkeiten in der Umgebung vorhanden waren. Dank uv
und PEP 723 gehört dies nun der Vergangenheit an.
uv: Ein schneller Paketmanager
uv
ist ein extrem schneller Paket- und Projektmanager für Python, der in Rust geschrieben wurde. Er bietet unter anderem ein Tool, das es ermöglicht, ein Python-Tool innerhalb eines Pakets aufzurufen. Dabei kümmert sich uv
um die Erstellung einer (zwischengespeicherten) virtuellen Umgebung, die Einrichtung der passenden Python-Version und die Installation aller notwendigen Abhängigkeiten.
PEP 723: Inline-Metadaten für Skripte
PEP 723 ist ein Python Enhancement Proposal, das ein Metadatenformat spezifiziert, welches in einzelne Python-Skripte eingebettet werden kann. Dies soll Launchern, IDEs und anderen externen Tools die Interaktion mit solchen Skripten erleichtern. Ein Beispiel für solche Metadaten:
requires = ['requests>=2.28.1']
import requests
response = requests.get('https://example.com')
print(response.status_code)
Kombination von uv und PEP 723
Durch die Kombination von uv
und den PEP-723-Metadaten innerhalb eines Python-Skripts lässt sich dieses nun sehr einfach ausführen:
uv run script.py
Anwendungsbeispiel: YouTube-Transkripte extrahieren
Ein praktisches Beispiel ist die Erstellung eines ausführbaren Skripts, das YouTube-Transkripte extrahiert. Hierfür wird ein Python-Skript mit Shebang und Inline-Metadaten erstellt:
#!/usr/bin/env -S uv run --script
requires = ["youtube-transcript-api"]
import sys
from youtube_transcript_api import YouTubeTranscriptApi
def get_transcript(video_id):
try:
transcript = YouTubeTranscriptApi.get_transcript(video_id)
text = "\n".join([entry['text'] for entry in transcript])
return text
except Exception as e:
return f"Error: {e}"
if name == " main ":
if len(sys.argv) < 2:
print('Usage: provide YouTube URL or video_id as argument')
sys.exit(1)
video_id = sys.argv[1]
# Extract video ID from URL if it's a full URL
if "youtube.com" in video_id:
video_id = video_id.split("v=")[1].split("&")[0]
# Assume it's already a video ID
transcript = get_transcript(video_id)
print(transcript)
Die Shebang-Zeile #!/usr/bin/env -S uv run --script
ist hierbei entscheidend. Nach dem Speichern des Skripts und dem Ausführbarmachen kann es wie folgt gestartet werden:
./youtube_transcript.py VIDEO_ID
Diese Entwicklung eröffnet neue Möglichkeiten für die nahtlose Ausführung von Python-Code. Während zuvor Tools wie PyInstaller für die Erstellung von eigenständigen Binärdateien bevorzugt wurden, ermöglicht uv
nun eine deutlich einfachere Alternative.