Projets Python
Le générateur de projet Python peut être utilisé pour créer une bibliothèque ou une application Python moderne configurée avec les meilleures pratiques, gérée avec UV, un seul fichier de verrouillage et un environnement virtuel dans un espace de travail UV, pytest pour exécuter les tests, Ruff pour l’analyse statique, et ty pour la vérification de type.
Utilisation
Section intitulée « Utilisation »Générer un projet Python
Section intitulée « Générer un projet Python »Vous pouvez générer un nouveau projet Python de deux manières :
pnpm nx g @aws/nx-plugin:py#projectyarn nx g @aws/nx-plugin:py#projectnpx nx g @aws/nx-plugin:py#projectbunx nx g @aws/nx-plugin:py#projectVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:py#project --dry-runyarn nx g @aws/nx-plugin:py#project --dry-runnpx nx g @aws/nx-plugin:py#project --dry-runbunx nx g @aws/nx-plugin:py#project --dry-run- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - py#project - Remplissez les paramètres requis
- Cliquez sur
Generate
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| name Requis | string | - | Le nom du projet Python |
| directory | string | packages | Répertoire parent où le projet est placé. |
| subDirectory | string | - | Le sous-répertoire dans lequel le projet est placé. Par défaut, il s'agit du nom du projet. |
| type Requis | application | library | application | Indique si le projet est une application ou une bibliothèque |
| moduleName | string | - | Nom du module Python |
| preferInstallDependencies | boolean | true | Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin. |
Sortie du générateur
Section intitulée « Sortie 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 Module initialisation
Répertoiretests
- __init__.py Module initialisation
- conftest.py Test configuration
- test_noop.py Placeholder test
- project.json Project configuration and build targets
- pyproject.toml Packaging configuration file used by UV
- .python-version Contains the project’s Python version
Vous remarquerez peut-être également les fichiers suivants créés/mis à jour à la racine de votre espace de travail :
- pyproject.toml Workspace level packaging configuration for UV
- .python-version Contains the workspace Python version
- uv.lock Lockfile for Python dependencies
Écrire du code source Python
Section intitulée « Écrire du code source Python »Ajoutez votre code source Python dans le répertoire <module-name>.
Importer le code de votre bibliothèque dans d’autres projets
Section intitulée « Importer le code de votre bibliothèque dans d’autres projets »Utilisez la cible add pour ajouter une dépendance à un projet Python.
Supposons que nous ayons créé deux projets Python, my_app et my_lib. Ceux-ci auront des noms de projet pleinement qualifiés my_scope.my_app et my_scope.my_lib, et par défaut auront chacun des noms de module my_scope_my_app et my_scope_my_lib.
Pour que my_app dépende de my_lib, nous pouvons exécuter la commande suivante :
pnpm nx run my_scope.my_app:add my_scope.my_libyarn nx run my_scope.my_app:add my_scope.my_libnpx nx run my_scope.my_app:add my_scope.my_libbunx nx run my_scope.my_app:add my_scope.my_libVous pouvez ensuite importer le code de votre bibliothèque :
from my_scope_my_lib.my_module import my_functionCi-dessus, my_scope_my_lib est le nom du module pour la bibliothèque, my_module correspond à un fichier source Python my_module.py, et my_function est une méthode définie dans ce fichier.
Dépendances
Section intitulée « Dépendances »Pour ajouter des dépendances à votre projet, vous pouvez exécuter la cible add dans votre projet Python, par exemple :
pnpm nx run my_scope.my_library:add some-pip-packageyarn nx run my_scope.my_library:add some-pip-packagenpx nx run my_scope.my_library:add some-pip-packagebunx nx run my_scope.my_library:add some-pip-packageCela ajoutera la dépendance au fichier pyproject.toml de votre projet et mettra à jour le uv.lock racine.
Code d’exécution
Section intitulée « Code d’exécution »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 toutes ses dépendances. Vous pouvez y parvenir en ajoutant une cible telle que la suivante à votre fichier 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-manylinux_2_28 --python `uv python pin` --target dist/packages/my_library/bundle -r dist/packages/my_library/bundle/requirements.txt" ], "parallel": false }, "dependsOn": ["compile"] }, },}Construction
Section intitulée « Construction »Votre projet Python est configuré avec une cible build (définie dans project.json), que vous pouvez exécuter via :
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>Où <project-name> est le nom pleinement qualifié de votre projet.
La cible build compilera, analysera, testera et vérifiera le type de votre projet.
La sortie de construction se trouve dans le dossier dist racine de votre espace de travail, à l’intérieur d’un répertoire pour votre package et cible, par exemple dist/packages/<my-library>/build
Pour construire tous les projets de votre espace de travail, exécutez :
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildOu utilisez la commande abrégée :
pnpm buildyarn buildnpm run buildbun buildpytest est configuré pour tester votre projet.
Écrire des tests
Section intitulée « É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
- my_module.py
Répertoiretests
- test_my_module.py Tests for my_module.py
Les tests sont des méthodes qui commencent par test_ et font des assertions pour vérifier les attentes, par exemple :
from my_library.my_module import say_hello
def test_say_hello(): assert say_hello("Darth Vader") == "Hello, Darth Vader!"Pour plus de détails sur la façon d’écrire des tests, veuillez vous référer à la documentation pytest.
Exécuter les tests
Section intitulée « Exécuter les tests »Les tests s’exécuteront dans le cadre de la cible build de votre projet, mais vous pouvez également les exécuter séparément en exécutant la cible test :
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Vous pouvez exécuter un test individuel ou une suite de tests en utilisant le flag -k, en spécifiant soit le nom du fichier de test soit de la méthode :
pnpm nx test <project-name> -k 'test_say_hello'yarn nx test <project-name> -k 'test_say_hello'npx nx test <project-name> -k 'test_say_hello'bunx nx test <project-name> -k 'test_say_hello'Vérification de type
Section intitulée « Vérification de type »Les projets Python utilisent ty pour la vérification de type.
Exécuter le vérificateur de type
Section intitulée « Exécuter le vérificateur de type »La vérification de type s’exécute dans le cadre de la cible build de votre projet, mais vous pouvez également l’exécuter séparément via la cible typecheck :
pnpm nx run <project-name>:typecheckyarn nx run <project-name>:typechecknpx nx run <project-name>:typecheckbunx nx run <project-name>:typecheckSupprimer les erreurs de type
Section intitulée « Supprimer les erreurs de type »Pour supprimer un diagnostic spécifique pour une seule ligne, ajoutez un commentaire # ty: ignore[<rule>] à la fin de la ligne, par exemple :
value: int = "not an int" # ty: ignore[invalid-assignment]Pour configurer le comportement de la vérification de type dans votre projet, ajoutez une section [tool.ty] au pyproject.toml de votre projet. Consultez la référence de configuration ty pour les options disponibles.
Les projets Python utilisent Ruff pour l’analyse.
Exécuter l’analyseur
Section intitulée « Exécuter l’analyseur »Pour invoquer l’analyseur afin de vérifier votre projet, vous pouvez exécuter la cible lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Corriger les problèmes d’analyse
Section intitulée « Corriger les problèmes d’analyse »La majorité des problèmes d’analyse ou de formatage peuvent être corrigés automatiquement. Vous pouvez demander à Ruff de corriger les problèmes d’analyse en exécutant avec l’argument --configuration=fix.
pnpm nx lint <project-name> --configuration=fixyarn nx lint <project-name> --configuration=fixnpx nx lint <project-name> --configuration=fixbunx nx lint <project-name> --configuration=fixDe même, si vous souhaitez corriger tous les problèmes d’analyse dans tous les packages de votre espace de travail, vous pouvez exécuter :
pnpm nx run-many --target lint --all --configuration=fixyarn nx run-many --target lint --all --configuration=fixnpx nx run-many --target lint --all --configuration=fixbunx nx run-many --target lint --all --configuration=fixIgnorer les problèmes d’analyse
Section intitulée « Ignorer les problèmes d’analyse »Pour éviter que les problèmes d’analyse ne vous ralentissent pendant le développement (en particulier si vous avez des problèmes non corrigeables automatiquement dans votre projet), vous pouvez exécuter une construction avec la configuration skip-lint :
pnpm nx run-many --target build --configuration=skip-lintyarn nx run-many --target build --configuration=skip-lintnpx nx run-many --target build --configuration=skip-lintbunx nx run-many --target build --configuration=skip-lintCela exécutera toujours Ruff dans le cadre de la construction, mais la cible lint sera toujours considérée comme réussie.