次の方法で共有


.NET Aspire で Python アプリを調整する

この記事では、.NET Aspire アプリ ホストで Python アプリを使用する方法について説明します。 この記事のサンプル アプリでは、Python アプリケーションを起動する方法を示します。 .NET Aspire の Python 拡張機能では、仮想環境を使用する必要があります。

前提 条件

.NET .NET Aspireを使用するには、次のものがローカルにインストールされている必要があります。

詳細については、 セットアップとツールの、および SDK を参照してください。

さらに、コンピューターに Python をインストールする必要があります。 この記事のサンプル アプリは、Python バージョン 3.12.4 と pip バージョン 24.1.2 で構築されています。 Python と pip のバージョンを確認するには、次のコマンドを実行します。

python --version
pip --version

Python (pipを含む) をダウンロードするには、Python ダウンロード ページを参照してください。

テンプレートを使用して .NET.NET Aspire プロジェクトを作成する

.NET Aspire で Python プロジェクトの起動を開始するには、まずスターター テンプレートを使用して .NET Aspire アプリケーション ホストを作成します。

dotnet new aspire -o PythonSample

同じターミナル セッションで、ディレクトリを新しく作成されたプロジェクトに変更します。

cd PythonSample

テンプレートが作成されたら、次のコマンドを使用してアプリ ホストを起動し、アプリ ホストと .NET.NET Aspire ダッシュボードが正常に起動 確認します。

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

アプリ ホストが起動すると、コンソール出力のダッシュボード リンクをクリックできるようになります。 この時点で、ダッシュボードにはリソースは表示されません。 ターミナルで CtrlC 押して、アプリ ホストを停止します。

Python アプリを準備する

.NET Aspire ソリューションを作成した前のターミナル セッションから、Python ソース コードを含む新しいディレクトリを作成します。

mkdir hello-python

新しく作成した hello-python ディレクトリにディレクトリを変更します。

cd hello-python

Python 仮想環境を初期化する

Python アプリを操作するには、仮想環境内にある必要があります。 仮想環境を作成するには、次のコマンドを実行します。

python -m venv .venv

仮想環境の詳細については、「Python: pip と venvを使用して仮想環境にパッケージをインストールする」を参照してください。

仮想環境をアクティブ化し、パッケージのインストールと使用を有効にするには、次のコマンドを実行します。

source .venv/bin/activate

次のコマンドを実行して、仮想環境内の pip が -date up-toであることを確認します。

python -m pip install --upgrade pip

Python パッケージをインストールする

hello-python ディレクトリに requirements.txt ファイルを作成し、次の行を追加して、Flask パッケージをインストールします。

Flask==3.0.3

次に、次のコマンドを実行して Flask パッケージをインストールします。

python -m pip install -r requirements.txt

Flask がインストールされたら、hello-python ディレクトリに main.py という名前の新しいファイルを作成し、次のコードを追加します。

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)

上記のコードは、ポート 8111 でリッスンし、ルート エンドポイントにアクセスしたときに "Hello, World!" メッセージを返す単純な Flask アプリを作成します。

アプリ ホスト プロジェクトを更新する

次のコマンドを実行して、Python ホスティング パッケージをインストールします。

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

パッケージがインストールされた後、プロジェクト XML には、次のような新しいパッケージ参照が必要です。

<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>

AddPythonApp API を呼び出し、プロジェクト名、プロジェクト パス、エントリ ポイント ファイルを指定して、Python プロジェクトを含むようにアプリ ホスト Program.cs ファイルを更新します。

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

大事な

AddPythonApp API は試験段階であり、将来のリリースで変更される可能性があります。 詳細については、ASPIREHOSTINGPYTHON001を参照してください。

アプリを実行する

Python ホスティング パッケージを追加し、アプリ ホスト Program.cs ファイルを更新し、Python プロジェクトを作成したので、アプリ ホストを実行できます。

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

コンソール出力のリンクをクリックして、ダッシュボードを起動します。 ダッシュボードには、Python プロジェクトがリソースとして表示されます。

.NET Aspire ダッシュボード: Python サンプルアプリ。

エンドポイント リンクを選択して、新しいブラウザー タブで hello-python エンドポイントを開きます。ブラウザーに "Hello, World!" というメッセージが表示されます。

.NET Aspire ダッシュボード: サンプル アプリ エンドポイント Python。

ターミナルで CtrlC 押して、アプリ ホストを停止します。

テレメトリのサポートを追加します。

少し可観測性を追加するには、依存する Python アプリの監視に役立つテレメトリを追加します。 Python プロジェクトで、次の OpenTelemetry パッケージを依存関係として requirements.txt ファイルに追加します。

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

上記の要件の更新では、OpenTelemetry パッケージと OTLP エクスポーターが追加されます。 次に、次のコマンドを実行して、Python アプリの要件を仮想環境に再インストールします。

python -m pip install -r requirements.txt

上記のコマンドは、OpenTelemetry パッケージと OTLP エクスポーターを仮想環境にインストールします。 既存の main.py コードを次のように置き換えて、OpenTelemetry コードを含むように Python アプリを更新します。

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)

アプリ ホスト プロジェクトの launchSettings を更新します。ASPIRE_ALLOW_UNSECURED_TRANSPORT 環境変数を含めるファイルをjson します。

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

ローカルで実行する場合、Python の OpenTelemetryclient がローカル開発証明書を拒否するため、ASPIRE_ALLOW_UNSECURED_TRANSPORT 変数が必要です。 アプリ ホスト をもう一度起動します。

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

アプリ ホストが起動すると、ダッシュボードに移動し、コンソール ログ出力に加えて、構造化ログもダッシュボードにルーティングされることに注意してください。

.NET Aspire ダッシュボード: Python プロセスからの構造化されたログ記録。

概要

この記事の範囲外の考慮事項がいくつかありますが、Pythonと統合 .NET Aspire ソリューションを構築する方法について学習しました。 また、AddPythonApp API を使用して Python アプリをホストする方法についても学習しました。

関連項目