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, utilizando um único arquivo de lock e ambiente virtual em um espaço de trabalho UV, pytest para execução de testes e Ruff para análise estática.
Uso
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 | - | The name of the Python project |
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 Arquivo de exemplo em Python
Directorytests
- __init__.py Inicialização do módulo
- conftest.py Configuração de testes
- test_hello.py Testes de exemplo
- 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 Python
Adicione seu código-fonte Python no diretório <module-name>
.
Importando Código da Biblioteca em Outros Projetos
Como os espaços de trabalho UV estão configurados, você pode referenciar seu projeto Python de qualquer outro projeto Python no 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
Ao usar seu projeto Python como código de runtime (por exemplo, como handler de uma função AWS Lambda), você precisará criar um bundle do código-fonte e todas suas dependências. Isso pode ser alcançado 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, lintar e testar seu projeto.
A saída do build pode ser encontrada na pasta dist
raiz do 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 projeto, mas também podem ser executados 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 suite de testes usando a 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, execute 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 Linting
A maioria dos problemas de linting ou formatação pode ser corrigida automaticamente. Você pode pedir ao Ruff para corrigir problemas usando 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
Similarmente, para corrigir todos os problemas de linting em todos os pacotes do workspace, execute:
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