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 “他のプロジェクトでのライブラリコードのインポート”

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

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

    上記の例では、my_libraryがモジュール名、helloはPythonソースファイルhello.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 -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