Pular para o conteúdo

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.

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

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - py#project
  5. Preencha os parâmetros obrigatórios
    • Clique em Generate
    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

    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

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

    Importando Código da Biblioteca em Outros Projetos

    Seção intitulada “Importando Código da 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 workspace:

    packages/my_other_project/my_other_project/main.py
    from "my_library.hello" import say_hello

    No exemplo acima, my_library é o nome do módulo, hello corresponde ao arquivo Python hello.py, e say_hello é um método definido em hello.py

    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.

    Ao usar seu projeto Python como código em runtime (por exemplo, como handler de uma função AWS Lambda), você precisará criar um bundle do código fonte com todas as dependências. Isso pode ser feito adicionando um target como o seguinte ao seu arquivo 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 -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"]
    },
    },
    }

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

    Terminal window
    pnpm 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

    O pytest está configurado para testar seu projeto.

    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:

    test/test_hello.py
    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.

    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:

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

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

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

    Projetos Python usam Ruff para linting.

    Para invocar o linter e verificar seu projeto, execute o target lint:

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

    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:

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

    Da mesma forma, para corrigir todos os problemas de lint em todos os pacotes do workspace:

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