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”Genera un progetto Python
Sezione intitolata “Genera 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#project
yarn nx g @aws/nx-plugin:py#project
npx nx g @aws/nx-plugin:py#project
bunx nx g @aws/nx-plugin:py#project
Puoi anche eseguire una prova per vedere quali file verrebbero modificati
pnpm nx g @aws/nx-plugin:py#project --dry-run
yarn nx g @aws/nx-plugin:py#project --dry-run
npx nx g @aws/nx-plugin:py#project --dry-run
bunx nx g @aws/nx-plugin:py#project --dry-run
Opzioni
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 del modulo
- hello.py File Python di esempio
Directorytests
- __init__.py Inizializzazione del modulo
- conftest.py Configurazione dei test
- test_hello.py Test di esempio
- project.json Configurazione del progetto e target di build
- pyproject.toml File di configurazione per il packaging utilizzato da UV
- .python-version Contiene la versione Python del progetto
Potresti anche notare questi file creati/aggiornati nella root del workspace:
- pyproject.toml Configurazione di 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”Grazie alla configurazione dei workspace UV, puoi referenziare il tuo progetto Python da qualsiasi altro progetto Python nel workspace:
from "my_library.hello" import say_hello
Nell’esempio, my_library
è il nome del modulo, 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 progetto, puoi eseguire il target add
nel tuo progetto Python, ad esempio:
pnpm nx run my_scope.my_library:add some-pip-package
yarn nx run my_scope.my_library:add some-pip-package
npx nx run my_scope.my_library:add some-pip-package
bunx nx run my_scope.my_library:add some-pip-package
Questo aggiungerà la dipendenza al file pyproject.toml
del progetto e aggiornerà il file uv.lock
principale.
Codice runtime
Sezione intitolata “Codice runtime”Quando usi il 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 dipendenze. Puoi farlo aggiungendo un target come il seguente al 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 -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"] }, },}
Il progetto Python è configurato con un target build
(definito in project.json
), eseguibile tramite:
pnpm nx run <project-name>:build
yarn nx run <project-name>:build
npx nx run <project-name>:build
bunx nx run <project-name>:build
Dove <project-name>
è il nome completo del progetto.
Il target build
eseguirà la compilazione, il linting e i test del progetto.
L’output della build si trova nella cartella dist
principale del workspace, all’interno di una directory specifica per il pacchetto e il target, ad esempio dist/packages/<my-library>/build
.
Testing
Sezione intitolata “Testing”pytest è configurato per il testing del progetto.
Scrivere test
Sezione intitolata “Scrivere test”I test vanno scritti nella directory test
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 utilizzano 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 sulla scrittura dei test, consultare la documentazione pytest.
Eseguire i test
Sezione intitolata “Eseguire i test”I test vengono eseguiti durante il target build
, ma puoi eseguirli separatamente con il target test
:
pnpm nx run <project-name>:test
yarn nx run <project-name>:test
npx nx run <project-name>:test
bunx nx run <project-name>:test
Puoi eseguire un singolo test o un gruppo di test usando il flag -k
, specificando il nome del file 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 verificare il progetto, esegui il target lint
:
pnpm nx run <project-name>:lint
yarn nx run <project-name>:lint
npx nx run <project-name>:lint
bunx nx run <project-name>:lint
Correggere i problemi di lint
Sezione intitolata “Correggere i problemi di lint”La maggior parte dei problemi di linting/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=fix
yarn nx run <project-name>:lint --configuration=fix
npx nx run <project-name>:lint --configuration=fix
bunx nx run <project-name>:lint --configuration=fix
Analogamente, per correggere tutti i problemi di linting in tutti i pacchetti del workspace:
pnpm nx run-many --target lint --all --configuration=fix
yarn nx run-many --target lint --all --configuration=fix
npx nx run-many --target lint --all --configuration=fix
bunx nx run-many --target lint --all --configuration=fix