Orchestrieren Python-Apps in .NET Aspire
In diesem Artikel erfahren Sie, wie Sie Python Apps in einem .NET Aspire App-Host verwenden. Die Beispiel-App in diesem Artikel veranschaulicht das Starten einer Python-Anwendung. Die Python Erweiterung für .NET Aspire erfordert die Verwendung virtueller Umgebungen.
Voraussetzungen
Um mit .NET.NET Aspirezu arbeiten, benötigen Sie folgendes lokal installiert:
- .NET 8.0 oder .NET 9,0
- Eine OCI-kompatible Containerlaufzeit, z. B.:
- Docker Desktop oder Podman. Weitere Informationen finden Sie unter container runtime.
- Eine integrierte Entwicklerumgebung (Integrated Developer Environment, IDE) oder ein Code-Editor, z. B.:
- Visual Studio 2022 Version 17.9 oder höher (optional)
-
Visual Studio Code (optional)
- C# Dev Kit: Erweiterung (optional)
- JetBrains Rider mit .NET.NET Aspire Plugin (optional)
Weitere Informationen finden Sie unter .NET.NET Aspire Setup und Toolingund .NET.NET Aspire SDK.
Darüber hinaus müssen Sie Python auf Ihrem Computer installieren. Die Beispiel-App in diesem Artikel wurde mit Python Version 3.12.4 und Pip Version 24.1.2 erstellt. Führen Sie die folgenden Befehle aus, um Ihre Python- und pip-Versionen zu überprüfen:
python --version
pip --version
Informationen zum Herunterladen Python (einschließlich pip
) finden Sie auf der Python Downloadseite.
Erstellen eines .NET.NET Aspire Projekts mithilfe der Vorlage
Um ein Python-Projekt in .NET Aspire zu starten, verwenden Sie zunächst die Starter-Vorlage, um einen Anwendungshost für .NET Aspire zu erstellen.
dotnet new aspire -o PythonSample
Ändern Sie in derselben Terminalsitzung Verzeichnisse in das neu erstellte Projekt:
cd PythonSample
Nachdem die Vorlage erstellt wurde, starten Sie den App-Host mit dem folgenden Befehl, um sicherzustellen, dass der App-Host und das .NET.NET Aspire-Dashboard erfolgreich gestartet werden.
dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj
Nachdem der App-Host gestartet wurde, sollte es möglich sein, auf den Dashboardlink in der Konsolenausgabe zu klicken. An diesem Punkt zeigt das Dashboard keine Ressourcen an. Beenden Sie den App-Host, indem Sie Ctrl + C im Terminal drücken.
Vorbereitung einer Python-App
Erstellen Sie in Ihrer vorherigen Terminalsitzung, in der Sie die .NET Aspire Lösung erstellt haben, ein neues Verzeichnis, das den Python Quellcode enthält.
mkdir hello-python
Ändern Sie Verzeichnisse in das neu erstellte hello-python Verzeichnis:
cd hello-python
Initialisieren Sie die virtuelle Umgebung Python
Um mit Python Apps zu arbeiten, müssen sie sich in einer virtuellen Umgebung befinden. Führen Sie zum Erstellen einer virtuellen Umgebung den folgenden Befehl aus:
python -m venv .venv
Weitere Informationen zu virtuellen Umgebungen finden Sie unter Python: Installieren von Paketen in einer virtuellen Umgebung mithilfe von Pip und venv.
Führen Sie zum Aktivieren der virtuellen Umgebung den folgenden Befehl aus, um die Installation und Verwendung von Paketen zu aktivieren:
source .venv/bin/activate
Stellen Sie sicher, dass pip innerhalb der virtuellen Umgebung up-to-date ist, indem Sie den folgenden Befehl ausführen:
python -m pip install --upgrade pip
Installiere Python Pakete
Installieren Sie das Flask-Paket, indem Sie eine requirements.txt Datei im hello-python Verzeichnis erstellen und die folgende Zeile hinzufügen:
Flask==3.0.3
Installieren Sie dann das Flask-Paket, indem Sie den folgenden Befehl ausführen:
python -m pip install -r requirements.txt
Erstellen Sie nach der Installation von Flask eine neue Datei namens main.py im hello-python- Verzeichnis, und fügen Sie den folgenden Code hinzu:
import os
import flask
app = flask.Flask(__name__)
@app.route('/', methods=['GET'])
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
port = int(os.environ.get('PORT', 8111))
app.run(host='0.0.0.0', port=port)
Der vorangehende Code erstellt eine einfache Flask-App, die auf Port 8111 lauscht, und gibt die Nachricht "Hello, World!"
zurück, wenn auf den Stammendpunkt zugegriffen wird.
Aktualisieren des App-Hostprojekts
Installieren Sie das Python Hostingpaket, indem Sie den folgenden Befehl ausführen:
dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0
Nach der Installation des Pakets sollte der Projekt-XML-Code einen neuen Paketverweis wie folgt aufweisen:
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.1.0" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
<UserSecretsId>5fd92a87-fff8-4a09-9f6e-2c0d656e25ba</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.1.0" />
<PackageReference Include="Aspire.Hosting.Python" Version="9.1.0" />
</ItemGroup>
</Project>
Aktualisieren Sie den App-Host Program.cs Datei, um das Python Projekt einzuschließen, indem Sie die AddPythonApp
-API aufrufen und den Projektnamen, den Projektpfad und die Einstiegspunktdatei angeben:
using Microsoft.Extensions.Hosting;
var builder = DistributedApplication.CreateBuilder(args);
#pragma warning disable ASPIREHOSTINGPYTHON001
var pythonapp = builder.AddPythonApp("hello-python", "../hello-python", "main.py")
.WithHttpEndpoint(env: "PORT")
.WithExternalHttpEndpoints()
.WithOtlpExporter();
#pragma warning restore ASPIREHOSTINGPYTHON001
if (builder.ExecutionContext.IsRunMode && builder.Environment.IsDevelopment())
{
pythonapp.WithEnvironment("DEBUG", "True");
}
builder.Build().Run();
Wichtig
Die AddPythonApp
-API ist experimentell und kann sich in zukünftigen Versionen ändern. Weitere Informationen finden Sie unter ASPIREHOSTINGPYTHON001.
App starten
Nachdem Sie das Python Hostingpaket hinzugefügt, den App-Host Program.cs Datei aktualisiert und ein Python Projekt erstellt haben, können Sie den App-Host ausführen:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Starten Sie das Dashboard, indem Sie auf den Link in der Konsolenausgabe klicken. Das Dashboard sollte das Python Projekt als Ressource anzeigen.
Wählen Sie den Link Endpunkte aus, um den hello-python
Endpunkt in einem neuen Browser-Tab zu öffnen. Der Browser sollte die Meldung "Hello, World!" anzeigen:
Beenden Sie den App-Host, indem Sie Ctrl + C im Terminal drücken.
Füge Telemetrieunterstützung hinzu.
Um etwas Überwachbarkeit hinzuzufügen, fügen Sie Telemetrie hinzu, um die abhängige App Python zu überwachen. Fügen Sie im Python Projekt das folgende OpenTelemetry Paket als Abhängigkeit in der Datei requirements.txt hinzu.
Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn
Das vorherige Anforderungsupdate fügt das OpenTelemetry Paket und den OTLP-Exporter hinzu. Installieren Sie als Nächstes die Python App-Anforderungen in der virtuellen Umgebung erneut, indem Sie den folgenden Befehl ausführen:
python -m pip install -r requirements.txt
Der vorstehende Befehl installiert das OpenTelemetry-Paket und den OTLP-Exporter in der virtuellen Umgebung. Aktualisieren Sie die Python-App so, dass sie den OpenTelemetry Code enthält, indem Sie den vorhandenen main.py Code durch Folgendes ersetzen:
import os
import logging
import flask
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor
app = flask.Flask(__name__)
trace.set_tracer_provider(TracerProvider())
otlpExporter = OTLPSpanExporter()
processor = BatchSpanProcessor(otlpExporter)
trace.get_tracer_provider().add_span_processor(processor)
FlaskInstrumentor().instrument_app(app)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@app.route('/', methods=['GET'])
def hello_world():
logger.info("request received!")
return 'Hello, World!'
if __name__ == '__main__':
port = int(os.environ.get('PORT', 8111))
debug = bool(os.environ.get('DEBUG', False))
host = os.environ.get('HOST', '127.0.0.1')
app.run(port=port, debug=debug, host=host)
Aktualisieren Sie die launchSettings.json Datei des App-Hostprojekts so, dass sie die ASPIRE_ALLOW_UNSECURED_TRANSPORT
Umgebungsvariable enthält:
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:17171;http://localhost:15209",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21171",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22122"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:15209",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19171",
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20208",
"ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
}
}
}
}
Die ASPIRE_ALLOW_UNSECURED_TRANSPORT
Variable ist erforderlich, da beim lokalen Ausführen des OpenTelemetry Clients in Python das lokale Entwicklungszertifikat abgelehnt wird. Starten Sie den App-Host erneut:
dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj
Sobald der App-Host gestartet wurde, öffnen Sie das Dashboard und beachten Sie, dass zusätzlich zur Konsolenprotokollausgabe auch strukturiertes Logging ebenfalls an das Dashboard weitergeleitet wird.
Zusammenfassung
Obwohl es mehrere Überlegungen gibt, die über den Umfang dieses Artikels hinausgehen, haben Sie erfahren, wie Sie eine .NET Aspire-Lösung erstellen, die mit Pythonintegriert ist. Außerdem haben Sie erfahren, wie Sie die AddPythonApp
-API zum Hosten von Python Apps verwenden.