Projetos Python
O gerador de projetos Python pode ser usado para criar uma biblioteca ou aplicação moderna em Python configurada com melhores práticas, gerenciada com UV, um único arquivo de lock e ambiente virtual em um UV workspace, pytest para execução de testes e Ruff para análise estática.
Utilização
Gerar um Projeto Python
Você pode gerar um novo projeto Python de duas formas:
- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)
na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - py#project
- Preencha os parâmetros obrigatórios
- Clique em
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
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
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
Opções
Parâmetro | Tipo | Padrão | Descrição |
---|---|---|---|
name Obrigatório | string | - | Project name. |
directory | string | packages | Parent directory where the project is placed. |
projectType Obrigatório | string | application | Project type |
moduleName | string | - | Python module name |
Saída do Gerador
O gerador criará a seguinte estrutura de projeto no diretório <directory>/<name>
:
Directory<module-name>
- __init__.py Inicialização do módulo
- hello.py Exemplo de arquivo fonte Python
Directorytests
- __init__.py Inicialização do módulo
- conftest.py Configuração de testes
- test_hello.py Exemplo de testes
- project.json Configuração do projeto e targets de build
- pyproject.toml Arquivo de configuração de empacotamento usado pelo UV
- .python-version Contém a versão do Python do projeto
Você também pode notar os seguintes arquivos criados/atualizados na raiz do workspace:
- pyproject.toml Configuração de empacotamento em nível de workspace para UV
- .python-version Contém a versão do Python do workspace
- uv.lock Arquivo de lock para dependências Python
Escrevendo Código Fonte Python
Adicione seu código fonte Python no diretório <module-name>
.
Importando Código da Sua Biblioteca em Outros Projetos
Como os UV workspaces estão configurados para você, é possível referenciar seu projeto Python de qualquer outro projeto Python no seu workspace:
from "my_library.hello" import say_hello
No exemplo acima, my_library
é o nome do módulo, hello
corresponde ao arquivo fonte Python hello.py
, e say_hello
é um método definido em hello.py
Dependências
Para adicionar dependências ao seu projeto, você pode executar o target add
no seu projeto Python, por exemplo:
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
Isso adicionará a dependência ao arquivo pyproject.toml
do seu projeto e atualizará o uv.lock
raiz.
Código de Runtime
Quando você usa seu projeto Python como código de runtime (por exemplo como handler de uma função AWS Lambda), será necessário criar um bundle do código fonte e todas suas dependências. Você pode fazer isso adicionando um target como o seguinte ao seu arquivo 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 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"] }, },}
Build
Seu projeto Python está configurado com um target build
(definido em project.json
), que pode ser executado via:
pnpm nx run <project-name>:build
yarn nx run <project-name>:build
npx nx run <project-name>:build
bunx nx run <project-name>:build
Onde <project-name>
é o nome totalmente qualificado do seu projeto.
O target build
irá compilar, verificar lint e testar seu projeto.
A saída do build pode ser encontrada na pasta dist
raiz do seu workspace, dentro de um diretório para seu pacote e target, por exemplo dist/packages/<my-library>/build
Testes
pytest está configurado para testar seu projeto.
Escrevendo Testes
Os testes devem ser escritos no diretório test
dentro do seu projeto, em arquivos Python prefixados com test_
, por exemplo:
Directorymy_library
- hello.py
Directorytest
- test_hello.py Testes para hello.py
Testes são métodos que começam com test_
e fazem asserções para verificar expectativas, por exemplo:
from my_library.hello 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.
Executando Testes
Os testes serão executados como parte do target build
do seu projeto, mas você também pode executá-los separadamente usando o 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
Você pode executar um teste individual ou um conjunto de testes usando o flag -k
, especificando o nome do arquivo de teste ou método:
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
Projetos Python usam Ruff para linting.
Executando o Linter
Para invocar o linter e verificar seu projeto, você pode executar o 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
Corrigindo Problemas de Lint
A maioria dos problemas de linting ou formatação podem ser corrigidos automaticamente. Você pode instruir o Ruff a corrigir problemas de lint executando com o argumento --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
Da mesma forma, se desejar corrigir todos os problemas de lint em todos os pacotes do seu workspace, você pode executar:
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