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で定義されたメソッドです。

    プロジェクトに依存関係を追加するには、Pythonプロジェクトで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-deps --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