Aller au contenu

Projets Python

Le générateur de projets Python permet de créer des bibliothèques ou applications Python modernes configurées avec les meilleures pratiques, gérées via UV, utilisant un fichier de verrouillage unique et un environnement virtuel dans un espace de travail UV, pytest pour l’exécution des tests, et Ruff pour l’analyse statique.

Vous pouvez générer un nouveau projet Python de deux manières :

  1. Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
  2. Ouvrez la console Nx dans VSCode
  3. Cliquez sur Generate (UI) dans la section "Common Nx Commands"
  4. Recherchez @aws/nx-plugin - py#project
  5. Remplissez les paramètres requis
    • Cliquez sur Generate
    Paramètre Type Par défaut Description
    name Requis string - The name of the Python project
    directory string packages Parent directory where the project is placed.
    projectType Requis string application Project type
    moduleName string - Python module name

    Le générateur créera la structure de projet suivante dans le répertoire <directory>/<name> :

    • Répertoire<module-name>
      • __init__.py Initialisation du module
      • hello.py Exemple de fichier source Python
    • Répertoiretests
      • __init__.py Initialisation du module
      • conftest.py Configuration des tests
      • test_hello.py Exemple de tests
    • project.json Configuration du projet et cibles de build
    • pyproject.toml Fichier de configuration d’emballage utilisé par UV
    • .python-version Contient la version Python du projet

    Vous remarquerez également ces fichiers créés/mis à jour à la racine de l’espace de travail :

    • pyproject.toml Configuration d’emballage au niveau workspace pour UV
    • .python-version Contient la version Python du workspace
    • uv.lock Fichier de verrouillage des dépendances Python

    Ajoutez votre code source Python dans le répertoire <module-name>.

    Importer votre bibliothèque dans d’autres projets

    Section intitulée « Importer votre bibliothèque dans d’autres projets »

    Grâce à la configuration des espaces de travail UV, vous pouvez référencer votre projet Python depuis n’importe quel autre projet Python dans votre workspace :

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

    Ici, my_library correspond au nom du module, hello au fichier source Python hello.py, et say_hello est une méthode définie dans hello.py.

    Pour ajouter des dépendances à votre projet, exécutez la cible add dans votre projet Python, par exemple :

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

    Cela ajoutera la dépendance au fichier pyproject.toml de votre projet et mettra à jour le uv.lock racine.

    Lorsque vous utilisez votre projet Python comme code d’exécution (par exemple comme gestionnaire pour une fonction AWS Lambda), vous devrez créer un bundle du code source et de ses dépendances. Ajoutez une cible comme celle-ci dans votre fichier 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"]
    },
    },
    }

    Votre projet Python est configuré avec une cible build (définie dans project.json), exécutable via :

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

    <project-name> est le nom qualifié complet de votre projet.

    La cible build compilera, linttera et testera votre projet.

    Le résultat du build se trouve dans le dossier dist à la racine de votre workspace, dans un répertoire spécifique au package et à la cible, par exemple dist/packages/<my-library>/build.

    pytest est configuré pour tester votre projet.

    Les tests doivent être écrits dans le répertoire test de votre projet, dans des fichiers Python préfixés par test_, par exemple :

    • Répertoiremy_library
      • hello.py
    • Répertoiretest
      • test_hello.py Tests pour hello.py

    Les tests sont des méthodes commençant par test_ qui vérifient des assertions, par exemple :

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

    Pour plus de détails sur l’écriture des tests, consultez la documentation pytest.

    Les tests s’exécutent lors de la cible build, mais vous pouvez aussi les lancer séparément via la cible test :

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

    Vous pouvez exécuter un test spécifique avec le flag -k en spécifiant le nom du fichier ou de la méthode :

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

    Les projets Python utilisent Ruff pour le linting.

    Pour lancer le linter et vérifier votre projet, utilisez la cible lint :

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

    La plupart des problèmes de linting ou de formatage peuvent être corrigés automatiquement. Utilisez l’argument --configuration=fix :

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

    Pour corriger tous les problèmes dans l’ensemble du workspace, exécutez :

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