Ir para o conteúdo

Criando e empacotando pacotes Python

Agora que vimos como podemos modularizar o código, seguiremos para etapa de empacotamento de pacotes. Ao empacotar um pacote, você prepara o código para ser compartilhado, instalado e utilizado por outras pessoas ou sistemas de forma simples, eficiente e padronizada.

Para isso usarei esse projeto pronto que utiliza os módulos de exemplo do Lab anterior.

Empacotando seu pacote Python

Após modularizar o código, o próximo passo é empacotar a biblioteca para que ela possa ser reutilizada em outros projetos. Você pode criar pacotes Python e disponibilizá-los para outras equipes da empresa ou até publicá-los no PyPI.

Este laboratório abordará como criar uma biblioteca Python para distribuí-la utilizando alternativas como repositórios privados ou Git, para compartilhar pacotes dentro da empresa.

Criando e Empacotando sua Biblioteca Python

  1. Estruturando o projeto para esse Lab, utilizaremos os módulos criados anteriormente, com a seguinte estrutura de arquivos:
first_py/
├── first_py/
│   ├── __init__.py
│   ├── __main__.py
│   ├── csv_functions.py
│   ├── db_functions.py
│   └── email_functions.py
├── tests/
├── MANIFEST.in
├── README.md
├── requirements.txt
├── setup.py
├── test_requirements.txt
└── VERSION

Onde:

  • first_py: Pasta que contém os módulos da sua biblioteca.
  • tests: Pasta que contém os testes automatizados.
  • MANIFEST.in: Arquivo que especifica quais arquivos devem ser incluídos no pacote.
  • README.md: Documentação do projeto.
  • requirements.txt: Arquivo que contém as dependências do projeto.
  • setup.py: Script para empacotar o projeto.
  • test_requirements.txt: Arquivo que contém as dependências para testes automatizados.
  • VERSION: Arquivo que contém a versão do projeto.

Empacotando o Projeto

1. Configuração do setup.py

Para empacotar o projeto, vamos utilizar o setuptools, que é uma biblioteca que facilita a criação de pacotes Python.

pip install setuptools

Dentro do projeto first_py, temos o arquivo setup.py que é essencial para empacotar sua biblioteca para distribuição.

Aqui está um exemplo básico:

from os import path
from setuptools import setup, find_packages


here = path.abspath(path.dirname(__file__))

with open(path.join(here, 'README.md'), encoding='utf-8') as readme_file:
    readme = readme_file.read()


with open(path.join(here, 'VERSION'), encoding='utf-8') as version_file:
    version = version_file.read()

with open(path.join(here, 'requirements.txt')) as requirements_file:
    # Parse requirements.txt, ignoring any commented-out lines.
    requirements = [line for line in requirements_file.read().splitlines()
                    if not line.startswith('#')]

with open(path.join(here, 'test_requirements.txt')) as test_requirements_file:
    # Parse requirements.txt, ignoring any commented-out lines.
    test_requirements = [line for line in test_requirements_file.read().splitlines()
                    if not line.startswith('#')]



setup(
    name="first_py",
    version=version,
    description="first_py",
    long_description=readme,
    long_description_content_type='text/markdown',
    packages=find_packages(exclude=['docs', 'tests']),
    include_package_data=True,
    package_data={
        "first_py": [
            # When adding files here, remember to update MANIFEST.in as well,
            # or else they will not be included in the distribution on PyPI!
            # 'path/to/data_file'
        ]
    },
    install_requires=requirements,
    tests_require=test_requirements,
)

Onde, na função setup(), você pode definir os seguintes parâmetros:

  • name: Nome do pacote.
  • version: Versão do pacote, que pode ser lida de um arquivo.
  • description: Descrição do pacote.
  • long_description: Descrição longa do pacote, que pode ser lida de um arquivo.
  • long_description_content_type: Tipo de conteúdo da descrição longa.
  • packages: Inclui todos os pacotes da pasta first_py, exceto os pacotes de documentação e testes.
  • include_package_data: Inclui arquivos adicionais especificados em package_data.
  • package_data (opcional): Lista de arquivos adicionais a serem incluídos no pacote.
  • install_requires: Lista de dependências do pacote, que podem ser lidas de um arquivo.
  • tests_require: Lista de dependências para testes automatizados, que podem ser lidas de um arquivo.

2. Gerando o Pacote

Para empacotar o projeto, use o seguinte comando:

python setup.py sdist

Quando você executar este comando, o setuptools irá:

  • Empacotar seu código Python, incluindo os módulos na pasta first_py.
  • Gerar um arquivo no formato .tar.gz (ou .whl se você rodar o outro comando).
  • O arquivo gerado será armazenado na pasta dist, que é onde o pacote será criado.

Agora sim, você tem um pacote Python que pode ser distribuído e instalado diretamente via pip.

Como distribuir esse pacote?

Uma das formas de distribuir seu pacote é utilizando o GitHub, onde você pode armazenar o código-fonte e disponibilizar para outras pessoas ou sistemas.

Para essa etapa, você precisa ter uma conta no GitHub e ter o Git instalado em sua máquina.

Criando um repositório no GitHub

Crie um repositório no GitHub, clicando em New na página inicial do GitHub.

Preencha os seguintes campos e clique em Create repository:

  • Repository name: first_py
  • Description: Meu primeiro pacote Python.
  • Public ou Private: Se você deseja que o repositório seja público ou privado, pode marcar como privado inicialmente.
  • Add .gitignore: Selecione Python.

Criando um repositório no GitHub

Enviando o código para o GitHub

Após criar o repositório, você pode enviar o código para o GitHub. Para isso, execute os seguintes comandos no terminal.

Para iniciar o git:

git init
Certifique-se de que está na branch main
git branch
Se a branch não está nomeada como main, crie uma nova:
git checkout -b main
Conecte o repositório remoto do GitHub:
git remote add origin https://github.com/SEU_USUARIO/first_py.git
Puxe o arquivo .gitignore do GitHub:
git pull origin main
Adicione todos arquivos ao git:
git add .
Faça o commit inicial:
git commit -m "Initial commit"
Envie o código para o GitHub:
git push -u origin main

Instalando o pacote via pip

Agora que você tem um pacote Python seguro alocado no github, você pode utilizar em seu robôs fazendo a instalação diretamente via pip.

Para repositórios públicos

  pip install git+https://github.com/SEU_USUARIO/first_py.git@main

Para repositórios privado

  pip install git+https://<SEU_TOKEN>@github.com/SEU_USUARIO/first_py.git@main

Para distribuir publicamente

Caso você queira distribuir publicamente para que qualquer pessoa tenha acesso via pip, é possível publicar seu pacote no PyPI, veja mais detalhes aqui conteúdo extra.