Salta ai contenuti

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 UV workspace, pytest per l’esecuzione dei test e Ruff per l’analisi statica.

Puoi generare un nuovo progetto Python in due modi:

  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - py#project
  5. Compila i parametri richiesti
    • Clicca su Generate
    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

    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 del 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 del packaging a livello workspace per UV
    • .python-version Contiene la versione Python del workspace
    • uv.lock File di lock per le dipendenze 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 completi di progetto my_scope.my_app e my_scope.my_lib, e per default avranno nomi di modulo my_scope_my_app e my_scope_my_lib.

    Per far dipendere my_app da my_lib, possiamo eseguire il comando:

    Terminal window
    pnpm nx run my_scope.my_app:add my_scope.my_lib

    Potrai quindi importare il codice della libreria:

    packages/my_app/my_scope_my_app/main.py
    from my_scope_my_lib.hello import say_hello

    Nell’esempio sopra, my_scope_my_lib è il nome del modulo per la libreria, hello corrisponde al file sorgente Python hello.py, e say_hello è un metodo definito in hello.py

    Per aggiungere dipendenze al tuo progetto, puoi eseguire il target add nel tuo progetto Python, ad esempio:

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

    Questo aggiungerà la dipendenza al file pyproject.toml del progetto e aggiornerà il root uv.lock.

    Quando usi 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 dipendenze. Puoi farlo aggiungendo un target come il seguente al tuo file 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 --package my_scope.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 tuo progetto Python è configurato con un target build (definito in project.json), che puoi eseguire tramite:

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

    Dove <project-name> è il nome completo del tuo progetto.

    Il target build compilerà, eseguirà il linting e testerà il progetto.

    L’output della build si troverà nella cartella dist root del workspace, all’interno di una directory per il tuo pacchetto e target, ad esempio dist/packages/<my-library>/build

    pytest è configurato per testare il tuo progetto.

    I test dovrebbero essere 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:

    test/test_hello.py
    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.

    I test verranno eseguiti come parte del target build del progetto, ma puoi anche eseguirli separatamente con il target test:

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

    Puoi eseguire un singolo test o una suite specifica usando il flag -k, specificando il nome del file di test o del metodo:

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

    I progetti Python utilizzano Ruff per il linting.

    Per invocare il linter e controllare il progetto, puoi eseguire il target lint:

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

    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:

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

    Analogamente, se vuoi correggere tutti i problemi di linting in tutti i pacchetti del workspace, puoi eseguire:

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