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.
Generar un Proyecto Python
Sección titulada «Generar un Proyecto Python»Puedes generar un nuevo proyecto Python de dos maneras:
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#projectTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
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- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - py#project - Complete los parámetros requeridos
- Haga clic en
Generate
Opciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | El nombre del proyecto Python |
| directory | string | packages | Directorio 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 Requerido | application | library | application | Si el proyecto es una aplicación o una biblioteca |
| moduleName | string | - | Nombre del módulo Python |
| preferInstallDependencies | boolean | true | Si 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. |
Salida del Generador
Sección titulada «Salida del Generador»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
Escribir Código Fuente Python
Sección titulada «Escribir Código Fuente Python»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:
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_libLuego puedes importar tu código de biblioteca:
from my_scope_my_lib.my_module import my_functionArriba, 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.
Dependencias
Sección titulada «Dependencias»Para agregar dependencias a tu proyecto, puedes ejecutar el objetivo add en tu proyecto Python, por ejemplo:
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-packageEsto agregará la dependencia al archivo pyproject.toml de tu proyecto, y actualizará el uv.lock raíz.
Código de Tiempo de Ejecución
Sección titulada «Código de Tiempo de Ejecución»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:
{ ... "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"] }, },}Construcción
Sección titulada «Construcción»Tu proyecto Python está configurado con un objetivo build (definido en project.json), que puedes ejecutar mediante:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx 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:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target buildO usa el comando abreviado:
pnpm buildyarn buildnpm run buildbun buildPruebas
Sección titulada «Pruebas»pytest está configurado para probar tu proyecto.
Escribir Pruebas
Sección titulada «Escribir Pruebas»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:
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.
Ejecutar Pruebas
Sección titulada «Ejecutar Pruebas»Las pruebas se ejecutarán como parte del objetivo build para tu proyecto, pero también puedes ejecutarlas por separado ejecutando el objetivo test:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx 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:
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'Verificación de Tipos
Sección titulada «Verificación de Tipos»Los proyectos Python usan ty para la verificación de tipos.
Ejecutar el Verificador de Tipos
Sección titulada «Ejecutar el Verificador 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:
pnpm nx run <project-name>:typecheckyarn nx run <project-name>:typechecknpx nx run <project-name>:typecheckbunx nx run <project-name>:typecheckSuprimir Errores de Tipo
Sección titulada «Suprimir Errores de Tipo»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.
Análisis
Sección titulada «Análisis»Los proyectos Python usan Ruff para el análisis.
Ejecutar el Analizador
Sección titulada «Ejecutar el Analizador»Para invocar el analizador para verificar tu proyecto, puedes ejecutar el objetivo lint.
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>Corregir Problemas de Análisis
Sección titulada «Corregir Problemas de Análisis»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.
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 manera similar, si deseas corregir todos los problemas de análisis en todos los paquetes de tu espacio de trabajo, puedes ejecutar:
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=fixOmitir Problemas de Análisis
Sección titulada «Omitir Problemas de Análisis»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:
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-lintEsto seguirá ejecutando Ruff como parte de la construcción, pero el objetivo lint siempre se considerará exitoso.