.NET Aspire で Python アプリを調整する
この記事では、.NET Aspire アプリ ホストで Python アプリを使用する方法について説明します。 この記事のサンプル アプリでは、Python アプリケーションを起動する方法を示します。 .NET Aspire の Python 拡張機能では、仮想環境を使用する必要があります。
前提 条件
.NET .NET Aspireを使用するには、次のものがローカルにインストールされている必要があります。
- .NET 8.0 または .NET 9.0
- OCI 準拠のコンテナー ランタイム。次に例を示します。
- デスクトップ または
を します。 詳細については、「コンテナー ランタイムの」を参照してください。
- デスクトップ または
- 次のような統合開発者環境 (IDE) またはコード エディター。
- Visual Studio 2022 バージョン17.9以上 (オプション)
-
Visual Studio Code (省略可能)
- C# Dev Kit: 拡張 (任意)
- JetBrains Rider と .NET.NET Aspire プラグイン (オプション)
詳細については、
さらに、コンピューターに 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
アプリ ホストが起動すると、コンソール出力のダッシュボード リンクをクリックできるようになります。 この時点で、ダッシュボードにはリソースは表示されません。 ターミナルで Ctrl
Python アプリを準備する
.NET Aspire ソリューションを作成した前のターミナル セッションから、Python ソース コードを含む新しいディレクトリを作成します。
mkdir hello-python
新しく作成した hello-python ディレクトリにディレクトリを変更します。
cd hello-python
Python 仮想環境を初期化する
Python アプリを操作するには、仮想環境内にある必要があります。 仮想環境を作成するには、次のコマンドを実行します。
python -m venv .venv
仮想環境の詳細については、「Python: pip と venvを使用して仮想環境にパッケージをインストールする」を参照してください。
仮想環境をアクティブ化し、パッケージのインストールと使用を有効にするには、次のコマンドを実行します。
-
/macOS の
- の Windows
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 プロジェクトがリソースとして表示されます。
エンドポイント リンクを選択して、新しいブラウザー タブで hello-python
エンドポイントを開きます。ブラウザーに "Hello, World!" というメッセージが表示されます。
ターミナルで Ctrl
テレメトリのサポートを追加します。
少し可観測性を追加するには、依存する 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
アプリ ホストが起動すると、ダッシュボードに移動し、コンソール ログ出力に加えて、構造化ログもダッシュボードにルーティングされることに注意してください。
概要
この記事の範囲外の考慮事項がいくつかありますが、Pythonと統合 .NET Aspire ソリューションを構築する方法について学習しました。 また、AddPythonApp
API を使用して Python アプリをホストする方法についても学習しました。
関連項目
.NET Aspire