Skip to content

Pythonプロジェクト

Pythonプロジェクトジェネレータは、モダンなPythonライブラリまたはアプリケーションを作成するために使用できます。これらのプロジェクトはベストプラクティスに基づいて設定され、UVによる依存関係管理、単一のロックファイル、UVワークスペース内の仮想環境、テスト実行用のpytest、静的解析用のRuffが構成されます。

使用方法

Pythonプロジェクトの生成

新しいPythonプロジェクトを2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - py#project
  5. 必須パラメータを入力
    • クリック Generate

    オプション

    パラメータ デフォルト 説明
    name 必須 string - Project name.
    directory string packages Parent directory where the project is placed.
    projectType 必須 string application Project type
    moduleName string - Python module name

    ジェネレータの出力

    ジェネレータは<directory>/<name>ディレクトリに以下のプロジェクト構造を作成します:

    • Directory<module-name>
      • __init__.py モジュール初期化
      • hello.py サンプルPythonソースファイル
    • Directorytests
      • __init__.py モジュール初期化
      • conftest.py テスト設定
      • test_hello.py サンプルテスト
    • project.json プロジェクト設定とビルドターゲット
    • pyproject.toml UV用パッケージ設定ファイル
    • .python-version プロジェクトのPythonバージョン記載

    ワークスペースルートにも以下のファイルが作成/更新されます:

    • pyproject.toml UV用ワークスペースレベルのパッケージ設定
    • .python-version ワークスペースのPythonバージョン記載
    • uv.lock Python依存関係のロックファイル

    Pythonソースコードの記述

    Pythonソースコードは<module-name>ディレクトリに追加します。

    他のプロジェクトでのライブラリコードのインポート

    UVワークスペースが設定されているため、ワークスペース内の他のPythonプロジェクトからプロジェクトを参照できます:

    packages/my_other_project/my_other_project/main.py
    from "my_library.hello" import say_hello

    上記の例では、my_libraryがモジュール名、hellohello.pyファイルに対応し、say_hellohello.pyで定義されたメソッドです。

    依存関係

    プロジェクトに依存関係を追加するには、以下のようにaddターゲットを実行します:

    Terminal window
    pnpm nx run my_scope.my_library:add some-pip-package

    これによりプロジェクトのpyproject.tomlに依存関係が追加され、ルートのuv.lockが更新されます。

    ランタイムコード

    Pythonプロジェクトをランタイムコード(例: AWS Lambda関数のハンドラ)として使用する場合、ソースコードとすべての依存関係をバンドルする必要があります。project.jsonに以下のようなターゲットを追加することで実現できます:

    project.json
    {
    ...
    "targets": {
    ...
    "bundle": {
    "cache": true,
    "executor": "nx:run-commands",
    "outputs": ["{workspaceRoot}/dist/packages/my_library/bundle"],
    "options": {
    "commands": [
    "uv export --frozen --no-dev --no-editable --project my_library -o dist/packages/my_library/bundle/requirements.txt",
    "uv pip install -n --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux2014 --python `uv python pin` --target dist/packages/my_library/bundle -r dist/packages/my_library/bundle/requirements.txt"
    ],
    "parallel": false
    },
    "dependsOn": ["compile"]
    },
    },
    }

    ビルド

    Pythonプロジェクトにはbuildターゲット(project.jsonで定義)が構成されており、以下のコマンドで実行できます:

    Terminal window
    pnpm nx run <project-name>:build

    <project-name>はプロジェクトの完全修飾名です。

    buildターゲットはプロジェクトのコンパイル、リント、テストを実行します。

    ビルド出力はワークスペースルートのdistフォルダ内(例: dist/packages/<my-library>/build)に生成されます。

    テスト

    pytestがプロジェクトのテスト用に構成されています。

    テストの記述

    テストはプロジェクト内のtestディレクトリにtest_プレフィックス付きのPythonファイルとして記述します:

    • Directorymy_library
      • hello.py
    • Directorytest
      • test_hello.py hello.pyのテスト

    テストメソッドはtest_で始まり、アサーションを使用して期待値を検証します:

    test/test_hello.py
    from my_library.hello import say_hello
    def test_say_hello():
    assert say_hello("Darth Vader") == "Hello, Darth Vader!"

    テストの書き方の詳細はpytestドキュメントを参照してください。

    テストの実行

    テストはbuildターゲットの一部として実行されますが、testターゲットで個別に実行することも可能です:

    Terminal window
    pnpm nx run <project-name>:test

    -kフラグを使用して特定のテストファイルやメソッドを指定できます:

    Terminal window
    pnpm nx run <project-name>:test -k 'test_say_hello'

    リンティング

    PythonプロジェクトではRuffを使用してリンティングを実施します。

    リンティングの実行

    プロジェクトのリンティングチェックにはlintターゲットを実行します:

    Terminal window
    pnpm nx run <project-name>:lint

    リント問題の修正

    ほとんどのリンティング/フォーマット問題は自動修正可能です。--configuration=fix引数を付けて実行することで修正できます:

    Terminal window
    pnpm nx run <project-name>:lint --configuration=fix

    ワークスペース内の全パッケージのリント問題を修正するには:

    Terminal window
    pnpm nx run-many --target lint --all --configuration=fix