Freigeben über


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:

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.

.NET Aspire Dashboard: Python Beispiel-App.

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:

.NET Aspire Dashboard: Python Beispiel-App-Endpunkt.

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.

.NET Aspire Dashboard: Strukturierte Protokollierung des Python Prozesses.

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.

Siehe auch