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 bonnes pratiques, gérées avec UV, un fichier de verrouillage unique et un environnement virtuel dans un espace de travail UV, pytest pour exécuter les tests, et Ruff pour l’analyse statique.

Utilisation

Générer un projet Python

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

    Options

    Paramètre Type Par défaut Description
    name Requis string - Project name.
    directory string packages Parent directory where the project is placed.
    projectType Requis string application Project type
    moduleName string - Python module name

    Résultat du générateur

    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’empaquetage utilisé par UV
    • .python-version Contient la version Python du projet

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

    • pyproject.toml Configuration d’empaquetage au niveau de l’espace de travail pour UV
    • .python-version Contient la version Python de l’espace de travail
    • uv.lock Fichier de verrouillage des dépendances Python

    Écrire du code Python

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

    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 espace de travail :

    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.

    Dépendances

    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 fichier uv.lock racine.

    Code d’exécution

    Lorsque vous utilisez votre projet Python comme code d’exécution (par exemple comme gestionnaire d’une fonction AWS Lambda), vous devrez créer un bundle du code source et de toutes ses dépendances. Vous pouvez y parvenir en ajoutant 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 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"]
    },
    },
    }

    Construction

    Votre projet Python est configuré avec une cible build (définie dans project.json) que vous pouvez exécuter 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 racine de votre espace de travail, dans un répertoire spécifique à votre package et à la cible, par exemple dist/packages/<my-library>/build.

    Tests

    pytest est configuré pour tester votre projet.

    Écrire des tests

    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 utilisent des assertions pour vérifier les attentes, 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 de tests, consultez la documentation pytest.

    Exécuter les tests

    Les tests s’exécutent automatiquement avec 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 individuel ou un groupe de tests avec le flag -k, en spécifiant le nom du fichier ou de la méthode de test :

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

    Vérification du code

    Les projets Python utilisent Ruff pour la vérification du code.

    Exécuter le linter

    Pour invoquer le linter et vérifier votre projet, exécutez la cible lint :

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

    Corriger les problèmes

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

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

    De même, pour corriger tous les problèmes dans tous les packages de votre espace de travail :

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