Sdílet prostřednictvím


Orchestrace aplikací Python v .NET Aspire

V tomto článku se dozvíte, jak používat Python aplikace v hostiteli .NET Aspire aplikací. Příklad aplikace v tomto článku demonstruje spuštění Python aplikace. Rozšíření Python pro .NET Aspire vyžaduje použití virtuálních prostředí.

Požadavky

Pokud chcete pracovat s .NET.NET Aspire, potřebujete místně nainstalovat následující:

Další informace najdete v tématu .NET.NET Aspire nastavení a nástrojea .NET.NET Aspire SDK.

Kromě toho je potřeba na počítač nainstalovat Python. Ukázková aplikace v tomto článku byla vytvořena s Python verze 3.12.4 a pip verze 24.1.2. Pokud chcete ověřit verze Python a pip, spusťte následující příkazy:

python --version
pip --version

Pokud chcete stáhnout Python (včetně pip), podívejte se na stránku ke stažení Python.

Vytvoření .NET.NET Aspire projektu pomocí šablony

Pokud chcete začít s spuštěním projektu Python v .NET Aspire nejprve pomocí úvodní šablony vytvořte hostitele aplikace .NET Aspire:

dotnet new aspire -o PythonSample

Ve stejné relaci terminálu změňte adresáře na nově vytvořený projekt:

cd PythonSample

Po vytvoření šablony spusťte hostitele aplikace pomocí následujícího příkazu, který zajistí úspěšné spuštění hostitele aplikace a řídicího panelu .NET.NET Aspire:

dotnet run --project PythonSample.AppHost/PythonSample.AppHost.csproj

Jakmile se hostitel aplikace spustí, měl by být možné kliknout na odkaz řídicího panelu ve výstupu konzoly. V tomto okamžiku řídicí panel nezobrazí žádné prostředky. Zastavte hostitele aplikace stisknutím klávesy Ctrl + C v terminálu.

Příprava aplikace Python

Z předchozí relace terminálu, ve které jste vytvořili řešení .NET Aspire, vytvořte nový adresář, který bude obsahovat Python zdrojový kód.

mkdir hello-python

Přejděte do nově vytvořeného adresáře hello-python:

cd hello-python

Inicializace virtuálního prostředí Python

Aby bylo možné pracovat s Python aplikacemi, musí být ve virtuálním prostředí. Pokud chcete vytvořit virtuální prostředí, spusťte následující příkaz:

python -m venv .venv

Další informace o virtuálních prostředích najdete v Python: Instalace balíčků ve virtuálním prostředí pomocí pip a venv.

Pokud chcete aktivovat virtuální prostředí, povolte instalaci a používání balíčků, spusťte následující příkaz:

source .venv/bin/activate

Spuštěním následujícího příkazu se ujistěte, že pip v rámci virtuálního prostředí up-to-date:

python -m pip install --upgrade pip

Instalace balíčků Python

Nainstalujte balíček Flask vytvořením souboru requirements.txt v adresáři hello-python a přidáním následujícího řádku:

Flask==3.0.3

Potom nainstalujte balíček Flask spuštěním následujícího příkazu:

python -m pip install -r requirements.txt

Po instalaci Flasku vytvořte nový soubor s názvem main.py v adresáři hello-python a přidejte následující kód:

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)

Předchozí kód vytvoří jednoduchou aplikaci Flask, která naslouchá na portu 8111 a vrátí zprávu "Hello, World!" při přístupu ke kořenovému koncovému bodu.

Aktualizace hostitelského projektu aplikace

Nainstalujte balíček hostování Python spuštěním následujícího příkazu:

dotnet add ../PythonSample.AppHost/PythonSample.AppHost.csproj package Aspire.Hosting.Python --version 9.0.0

Po instalaci balíčku by xml projektu měl mít nový odkaz na balíček podobný následujícímu:

<Project Sdk="Microsoft.NET.Sdk">

  <Sdk Name="Aspire.AppHost.Sdk" Version="9.0.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.0.0" />
    <PackageReference Include="Aspire.Hosting.Python" Version="9.0.0" />
  </ItemGroup>

</Project>

Aktualizujte soubor hostitele aplikace Program.cs tak, aby zahrnoval projekt Python, zavoláním rozhraní API AddPythonApp a zadáním názvu projektu, cesty k projektu a souboru vstupního bodu:

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();

Důležitý

Rozhraní API AddPythonApp je experimentální a v budoucích verzích se může změnit. Další informace naleznete v tématu ASPIREHOSTINGPYTHON001.

Spuštění aplikace

Teď, když jste přidali balíček hostování Python, aktualizovali hostitele aplikace Program.cs soubor a vytvořili Python projekt, můžete spustit hostitele aplikace:

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj

Spusťte řídicí panel kliknutím na odkaz ve výstupu konzoly. Řídicí panel by měl zobrazit projekt Python jako zdroj.

řídicí panel .NET Aspire: ukázková aplikace Python.

Výběrem odkazu Koncové body otevřete koncový bod hello-python na nové kartě prohlížeče. Prohlížeč by měl zobrazit zprávu "Hello, World!":

řídicí panel .NET Aspire: Python koncový bod ukázkové aplikace.

Zastavte hostitele aplikace stisknutím klávesy Ctrl + C v terminálu.

Přidání podpory telemetrie

Pokud chcete přidat trochu sledovatelnosti, přidejte telemetrii, která pomáhá sledovat závislou Python aplikaci. V projektu Python přidejte do souboru OpenTelemetry následující balíček jako závislost:

Flask==3.0.3
opentelemetry-distro
opentelemetry-exporter-otlp-proto-grpc
opentelemetry-instrumentation-flask
gunicorn

Předchozí aktualizace požadavku přidá balíček OpenTelemetry a vývozce OTLP. Potom znovu nainstalujte požadavky aplikace Python do virtuálního prostředí spuštěním následujícího příkazu:

python -m pip install -r requirements.txt

Předchozí příkaz nainstaluje balíček OpenTelemetry a vývozce OTLP ve virtuálním prostředí. Aktualizujte Python aplikaci tak, aby zahrnovala kód OpenTelemetry, a nahraďte stávající kód main.py následujícím kódem:

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)

Aktualizujte projekt hostování aplikace launchSettingsjson soubor tak, aby obsahoval proměnnou prostředí ASPIRE_ALLOW_UNSECURED_TRANSPORT:

{
  "$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"
      }
    }
  }
}

Proměnná ASPIRE_ALLOW_UNSECURED_TRANSPORT je povinná, protože při místním spuštění OpenTelemetryclient v Python odmítne místní vývojový certifikát. Znovu spusťte hostitele aplikace :

dotnet run --project ../PythonSample.AppHost/PythonSample.AppHost.csproj

Po spuštění hostitele aplikace přejděte na řídicí panel a všimněte si, že kromě výstupu protokolu konzoly se strukturované protokolování směruje také na řídicí panel.

řídicí panel .NET Aspire: Strukturované protokolování z procesu Python

Shrnutí

I když existuje několik aspektů nad rámec tohoto článku, naučili jste se vytvářet .NET Aspire řešení, které se integruje s Python. Dozvěděli jste se také, jak používat rozhraní API AddPythonApp k hostování Python aplikací.

Viz také