Skip to content

Pythonプロジェクト

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

新しい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 - The name of the Python project
    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ソースコードは<module-name>ディレクトリに追加します。

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

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

    Pythonプロジェクトに依存関係を追加するにはaddターゲットを使用します。

    my_appmy_libという2つのPythonプロジェクトを作成した場合、完全修飾プロジェクト名はmy_scope.my_appmy_scope.my_libになり、デフォルトのモジュール名はmy_scope_my_appmy_scope_my_libになります。

    my_appmy_libに依存するようにするには、次のコマンドを実行します:

    Terminal window
    pnpm nx run my_scope.my_app:add my_scope.my_lib

    これでライブラリコードをインポートできます:

    packages/my_app/my_scope_my_app/main.py
    from my_scope_my_lib.hello import say_hello

    上記の例では、my_scope_my_libがライブラリのモジュール名、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 packages/my_library --package my_scope.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