Pular para o conteúdo

Projetos Python

O gerador de projetos Python pode ser usado para criar uma biblioteca ou aplicação Python moderna configurada com as melhores práticas, gerenciada com UV, um único lockfile e ambiente virtual em um workspace UV, pytest para executar testes, Ruff para análise estática, e ty para verificação de tipos.

Você pode gerar um novo projeto Python de duas maneiras:

Execute este gerador@aws/nx-plugin:py#project

pnpm nx g @aws/nx-plugin:py#project
Monte seu comando6

Obrigatório

Obrigatório

Opções do gerador6 opções
nameObrigatóriostring

O nome do projeto Python

typeObrigatórioenumPadrão: application

Se o projeto é uma aplicação ou biblioteca

applicationlibrary
directorystringPadrão: packages

Diretório pai onde o projeto é colocado.

subDirectorystring

O subdiretório onde o projeto é colocado. Por padrão, este é o nome do projeto.

moduleNamestring

Nome do módulo Python

preferInstallDependenciesbooleanPadrão: true

Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final.

O gerador criará a seguinte estrutura de projeto no diretório <directory>/<name>:

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

Você também pode notar os seguintes arquivos criados/atualizados na raiz do seu workspace:

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

Adicione seu código-fonte Python no diretório <module-name>.

Importando o Código da sua Biblioteca em Outros Projetos

Seção intitulada “Importando o Código da sua Biblioteca em Outros Projetos”

Use o target add para adicionar uma dependência a um projeto Python.

Suponha que criamos dois projetos python, my_app e my_lib. Estes terão nomes de projeto totalmente qualificados de my_scope.my_app e my_scope.my_lib, e por padrão cada um terá nomes de módulo de my_scope_my_app e my_scope_my_lib.

Para que my_app dependa de my_lib, podemos executar o seguinte comando:

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

Você pode então importar o código da sua biblioteca:

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

Acima, my_scope_my_lib é o nome do módulo para a lib, my_module corresponde a um arquivo-fonte Python my_module.py, e my_function é um método definido nesse arquivo.

Para adicionar dependências ao seu projeto, você pode executar o target add no seu projeto Python, por exemplo:

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

Isso adicionará a dependência ao arquivo pyproject.toml do seu projeto e atualizará o uv.lock raiz.

Quando você usa seu projeto Python como código de runtime (por exemplo, como o handler para uma função AWS lambda), você precisará criar um bundle do código-fonte e todas as suas dependências. Os geradores py#lambda-function, py#api e py#mcp-server adicionam isso para você. Para adicionar um manualmente, adicione targets como o seguinte ao seu arquivo project.json, correspondendo à forma que esses geradores fornecem:

project.json
{
"targets": {
"bundle": {
"dependsOn": ["bundle-x86"]
},
"bundle-x86": {
"cache": true,
"inputs": ["production", "^production"],
"executor": "nx:run-commands",
"outputs": ["{workspaceRoot}/dist/{projectRoot}/bundle-x86"],
"options": {
"commands": [
"uv export --frozen --no-dev --no-editable --project {projectRoot} --package my_scope.my_library -o dist/{projectRoot}/bundle-x86/requirements.txt",
"uv pip install -n --no-deps --no-installer-metadata --no-compile-bytecode --python-platform x86_64-manylinux_2_28 --python-version 3.14 --target dist/{projectRoot}/bundle-x86 -r dist/{projectRoot}/bundle-x86/requirements.txt"
],
"parallel": false
},
"dependsOn": ["compile"]
}
}
}

Instale as dependências Python com o seguinte comando:

Janela do terminal
uv sync

Seu projeto Python está configurado com um target build (definido em project.json), que você pode executar via:

Terminal window
pnpm nx build <project-name>

Onde <project-name> é o nome totalmente qualificado do seu projeto.

O target build irá compilar, fazer lint, testar e verificar tipos do seu projeto.

A saída da construção pode ser encontrada na pasta dist raiz no seu workspace, dentro de um diretório para seu pacote e target, por exemplo dist/packages/<my-library>/build

Para construir todos os projetos no seu workspace, execute:

Terminal window
pnpm nx run-many --target build

Ou use o comando abreviado:

Terminal window
pnpm build

Seu projeto também tem um target assemble, que produz o que seu projeto contribui para um deployment (por exemplo, sua saída compilada ou em bundle), sem executar as verificações de lint, teste ou verificação de tipos.

Terminal window
pnpm nx assemble <project-name>

Os targets de deploy dependem de assemble, então o deploy constrói apenas o que está prestes a implantar.

pytest está configurado para testar seu projeto.

Os testes devem ser escritos no diretório tests dentro do seu projeto, em arquivos python prefixados com test_, por exemplo:

  • Directorymy_library
    • my_module.py
  • Directorytests
    • test_my_module.py Tests for my_module.py

Testes são métodos que começam com test_ e fazem asserções para verificar expectativas, por exemplo:

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 mais detalhes sobre como escrever testes, consulte a documentação do pytest.

Os testes serão executados como parte do target build para seu projeto, mas você também pode executá-los separadamente executando o target test:

Terminal window
pnpm nx test <project-name>

Você pode executar um teste individual ou conjunto de testes usando a flag -k, especificando o nome do arquivo de teste ou método:

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

O diretório tests do seu projeto é excluído da entrada nomeada production em nx.json.

Targets cuja saída não pode conter um arquivo de teste - como compile e quaisquer targets de bundle - leem production em vez de default, então editar um teste não os invalida nem qualquer tarefa em um projeto que depende do seu.

A exclusão é deliberadamente limitada ao diretório tests. Um arquivo test_*.py dentro do diretório do seu pacote é tratado como código de produção, já que é empacotado na sua distribuição construída, e portanto ainda invalida a construção.

Os targets test, lint, format e typecheck leem default e, portanto, ainda são executados novamente quando você edita um teste. Note que typecheck verifica os tipos dos seus testes também, então um erro de tipo em um teste ainda é reportado.

Projetos Python usam ty para verificação de tipos.

A verificação de tipos é executada como parte do target build para seu projeto, mas você também pode executá-la separadamente via o target typecheck:

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

Para suprimir um diagnóstico específico para uma única linha, adicione um comentário # ty: ignore[<rule>] no final da linha, por exemplo:

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

Para configurar o comportamento da verificação de tipos em todo o seu projeto, adicione uma seção [tool.ty] ao pyproject.toml do seu projeto. Consulte a referência de configuração do ty para opções disponíveis.

Projetos Python usam Ruff para linting.

Para invocar o linter para verificar seu projeto, você pode executar o target lint.

Terminal window
pnpm nx lint <project-name>

A maioria dos problemas de linting ou formatação pode ser corrigida automaticamente. Você pode dizer ao Ruff para corrigir problemas de lint executando com o argumento --configuration=fix.

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

Da mesma forma, se você quiser corrigir todos os problemas de lint em todos os pacotes no seu workspace, você pode executar:

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

Para evitar que problemas de linting te atrasem durante o desenvolvimento (particularmente se você tiver problemas não auto-corrigíveis no seu projeto), você pode executar uma construção com a configuração skip-lint:

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

Isso ainda executará o Ruff como parte da construção, mas o target lint sempre será considerado bem-sucedido.