Progetti Python
Il generatore di progetti Python può essere utilizzato per creare una moderna libreria o applicazione Python configurata con le migliori pratiche, gestita con UV, un singolo file di lock e un ambiente virtuale in un workspace UV, pytest per l’esecuzione dei test, e Ruff per l’analisi statica.
Utilizzo
Sezione intitolata “Utilizzo”Generare un Progetto Python
Sezione intitolata “Generare un Progetto Python”Puoi generare un nuovo progetto Python in due modi:
- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - py#project - Compila i parametri richiesti
- Clicca su
Generate
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#projectPuoi anche eseguire una prova per vedere quali file verrebbero modificati
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-runOpzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| name Obbligatorio | string | - | The name of the Python project |
| directory | string | packages | Parent directory where the project is placed. |
| projectType Obbligatorio | string | application | Project type |
| moduleName | string | - | Python module name |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore creerà la seguente struttura del progetto nella directory <directory>/<name>:
Directory<module-name>
- __init__.py Inizializzazione modulo
- hello.py File Python di esempio
Directorytests
- __init__.py Inizializzazione modulo
- conftest.py Configurazione test
- test_hello.py Test di esempio
- project.json Configurazione progetto e target di build
- pyproject.toml File di configurazione packaging utilizzato da UV
- .python-version Contiene la versione Python del progetto
Potresti anche notare i seguenti file creati/aggiornati nella root del workspace:
- pyproject.toml Configurazione packaging a livello workspace per UV
- .python-version Contiene la versione Python del workspace
- uv.lock File di lock per le dipendenze Python
Scrivere Codice Python
Sezione intitolata “Scrivere Codice Python”Aggiungi il tuo codice sorgente Python nella directory <module-name>.
Importare il Codice della Libreria in Altri Progetti
Sezione intitolata “Importare il Codice della Libreria in Altri Progetti”Utilizza il target add per aggiungere una dipendenza a un progetto Python.
Supponiamo di aver creato due progetti Python, my_app e my_lib. Questi avranno nomi progetto completamente qualificati my_scope.my_app e my_scope.my_lib, e per default avranno nomi modulo my_scope_my_app e my_scope_my_lib.
Per far dipendere my_app da my_lib, possiamo eseguire il comando:
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_libPotrai quindi importare il codice della libreria:
from my_scope_my_lib.hello import say_helloQui sopra, my_scope_my_lib è il nome modulo della libreria, hello corrisponde al file sorgente Python hello.py, e say_hello è un metodo definito in hello.py
Dipendenze
Sezione intitolata “Dipendenze”Per aggiungere dipendenze al tuo progetto, puoi eseguire il target add nel tuo progetto Python, ad esempio:
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-packageQuesto aggiungerà la dipendenza al file pyproject.toml del progetto e aggiornerà il root uv.lock.
Codice Runtime
Sezione intitolata “Codice Runtime”Quando utilizzi il tuo progetto Python come codice runtime (ad esempio come handler per una funzione AWS lambda), dovrai creare un bundle del codice sorgente e di tutte le sue dipendenze. Puoi ottenere questo aggiungendo un target come il seguente al tuo file 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"] }, },}Il tuo progetto Python è configurato con un target build (definito in project.json), che puoi eseguire tramite:
pnpm nx run <project-name>:buildyarn nx run <project-name>:buildnpx nx run <project-name>:buildbunx nx run <project-name>:buildDove <project-name> è il nome completamente qualificato del tuo progetto.
Il target build compilerà, eseguirà il linting e testerà il progetto.
L’output della build si troverà nella cartella root dist del workspace, all’interno di una directory per il tuo package e target, ad esempio dist/packages/<my-library>/build
Testing
Sezione intitolata “Testing”pytest è configurato per testare il tuo progetto.
Scrivere Test
Sezione intitolata “Scrivere Test”I test dovrebbero essere scritti nella directory test all’interno del progetto, in file Python prefissati con test_, ad esempio:
Directorymy_library
- hello.py
Directorytest
- test_hello.py Test per hello.py
I test sono metodi che iniziano con test_ e fanno asserzioni per verificare le aspettative, ad esempio:
from my_library.hello import say_hello
def test_say_hello(): assert say_hello("Darth Vader") == "Hello, Darth Vader!"Per maggiori dettagli su come scrivere test, consulta la documentazione pytest.
Eseguire Test
Sezione intitolata “Eseguire Test”I test verranno eseguiti come parte del target build del progetto, ma puoi anche eseguirli separatamente con il target test:
pnpm nx run <project-name>:testyarn nx run <project-name>:testnpx nx run <project-name>:testbunx nx run <project-name>:testPuoi eseguire un singolo test o una suite di test usando il flag -k, specificando il nome del file test o del metodo:
pnpm nx run <project-name>:test -k 'test_say_hello'yarn nx run <project-name>:test -k 'test_say_hello'npx nx run <project-name>:test -k 'test_say_hello'bunx nx run <project-name>:test -k 'test_say_hello'Linting
Sezione intitolata “Linting”I progetti Python utilizzano Ruff per il linting.
Eseguire il Linter
Sezione intitolata “Eseguire il Linter”Per invocare il linter e controllare il progetto, puoi eseguire il target lint:
pnpm nx run <project-name>:lintyarn nx run <project-name>:lintnpx nx run <project-name>:lintbunx nx run <project-name>:lintCorreggere Problemi di Linting
Sezione intitolata “Correggere Problemi di Linting”La maggior parte dei problemi di linting o formattazione può essere corretta automaticamente. Puoi chiedere a Ruff di correggere i problemi eseguendo con l’argomento --configuration=fix:
pnpm nx run <project-name>:lint --configuration=fixyarn nx run <project-name>:lint --configuration=fixnpx nx run <project-name>:lint --configuration=fixbunx nx run <project-name>:lint --configuration=fixAnalogamente, se vuoi correggere tutti i problemi di linting in tutti i package del workspace, puoi eseguire:
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=fix