Ir al contenido

Proyectos Python

El generador de proyectos Python se puede utilizar para crear una biblioteca o aplicación moderna de Python configurada con las mejores prácticas, gestionada con UV, un único archivo de bloqueo y entorno virtual en un espacio de trabajo UV, pytest para ejecutar pruebas, Ruff para análisis estático, y ty para verificación de tipos.

Puedes generar un nuevo proyecto Python de dos maneras:

Terminal window
pnpm nx g @aws/nx-plugin:py#project
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:py#project --dry-run
ParámetroTipoPredeterminadoDescripción
name Requeridostring-El nombre del proyecto Python
directory stringpackagesDirectorio padre donde se coloca el proyecto.
subDirectory string-El subdirectorio en el que se coloca el proyecto. Por defecto, este es el nombre del proyecto.
type Requeridoapplication | libraryapplicationSi el proyecto es una aplicación o una biblioteca
moduleName string-Nombre del módulo Python
preferInstallDependencies booleantrueSi se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsecuentes puedan calcular el grafo de proyectos de Nx); instala una vez al final.

El generador creará la siguiente estructura de proyecto en el directorio <directory>/<name>:

  • Directorio<module-name>
    • __init__.py Module initialisation
  • Directoriotests
    • __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

También puedes notar los siguientes archivos creados/actualizados en la raíz de tu espacio de trabajo:

  • pyproject.toml Workspace level packaging configuration for UV
  • .python-version Contains the workspace Python version
  • uv.lock Lockfile for Python dependencies

Agrega tu código fuente Python en el directorio <module-name>.

Importar tu Código de Biblioteca en Otros Proyectos

Sección titulada «Importar tu Código de Biblioteca en Otros Proyectos»

Usa el objetivo add para agregar una dependencia a un proyecto Python.

Supongamos que hemos creado dos proyectos python, my_app y my_lib. Estos tendrán nombres de proyecto completamente calificados de my_scope.my_app y my_scope.my_lib, y por defecto cada uno tendrá nombres de módulo de my_scope_my_app y my_scope_my_lib.

Para que my_app dependa de my_lib, podemos ejecutar el siguiente comando:

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

Luego puedes importar tu código de biblioteca:

packages/my_app/my_scope_my_app/main.py
from my_scope_my_lib.my_module import my_function

Arriba, my_scope_my_lib es el nombre del módulo para la biblioteca, my_module corresponde a un archivo fuente Python my_module.py, y my_function es un método definido en ese archivo.

Para agregar dependencias a tu proyecto, puedes ejecutar el objetivo add en tu proyecto Python, por ejemplo:

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

Esto agregará la dependencia al archivo pyproject.toml de tu proyecto, y actualizará el uv.lock raíz.

Cuando uses tu proyecto Python como código de tiempo de ejecución (por ejemplo, como el controlador para una función lambda de AWS), necesitarás crear un paquete del código fuente y todas sus dependencias. Puedes lograr esto agregando un objetivo como el siguiente a tu archivo 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-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"]
},
},
}

Tu proyecto Python está configurado con un objetivo build (definido en project.json), que puedes ejecutar mediante:

Terminal window
pnpm nx build <project-name>

Donde <project-name> es el nombre completamente calificado de tu proyecto.

El objetivo build compilará, analizará, probará y verificará los tipos de tu proyecto.

La salida de la construcción se puede encontrar en la carpeta dist raíz en tu espacio de trabajo, dentro de un directorio para tu paquete y objetivo, por ejemplo dist/packages/<my-library>/build

Para construir todos los proyectos en tu espacio de trabajo, ejecuta:

Terminal window
pnpm nx run-many --target build

O usa el comando abreviado:

Terminal window
pnpm build

pytest está configurado para probar tu proyecto.

Las pruebas deben escribirse en el directorio test dentro de tu proyecto, en archivos python con el prefijo test_, por ejemplo:

  • Directoriomy_library
    • my_module.py
  • Directoriotests
    • test_my_module.py Tests for my_module.py

Las pruebas son métodos que comienzan con test_ y hacen aserciones para verificar expectativas, por ejemplo:

tests/test_my_module.py
from my_library.my_module import say_hello
def test_say_hello():
assert say_hello("Darth Vader") == "Hello, Darth Vader!"

Para más detalles sobre cómo escribir pruebas, consulta la documentación de pytest.

Las pruebas se ejecutarán como parte del objetivo build para tu proyecto, pero también puedes ejecutarlas por separado ejecutando el objetivo test:

Terminal window
pnpm nx test <project-name>

Puedes ejecutar una prueba individual o un conjunto de pruebas usando la bandera -k, especificando el nombre del archivo de prueba o del método:

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

Los proyectos Python usan ty para la verificación de tipos.

La verificación de tipos se ejecuta como parte del objetivo build para tu proyecto, pero también puedes ejecutarla por separado mediante el objetivo typecheck:

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

Para suprimir un diagnóstico específico para una sola línea, agrega un comentario # ty: ignore[<rule>] al final de la línea, por ejemplo:

value: int = "not an int" # ty: ignore[invalid-assignment]

Para configurar el comportamiento de la verificación de tipos en tu proyecto, agrega una sección [tool.ty] al pyproject.toml de tu proyecto. Consulta la referencia de configuración de ty para las opciones disponibles.

Los proyectos Python usan Ruff para el análisis.

Para invocar el analizador para verificar tu proyecto, puedes ejecutar el objetivo lint.

Terminal window
pnpm nx lint <project-name>

La mayoría de los problemas de análisis o formato se pueden corregir automáticamente. Puedes indicarle a Ruff que corrija problemas de análisis ejecutando con el argumento --configuration=fix.

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

De manera similar, si deseas corregir todos los problemas de análisis en todos los paquetes de tu espacio de trabajo, puedes ejecutar:

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

Para evitar que los problemas de análisis te ralenticen durante el desarrollo (particularmente si tienes problemas no corregibles automáticamente en tu proyecto), puedes ejecutar una construcción con la configuración skip-lint:

Terminal window
pnpm nx run-many --target build --configuration=skip-lint

Esto seguirá ejecutando Ruff como parte de la construcción, pero el objetivo lint siempre se considerará exitoso.