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
- 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
.
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
git branch
main
, crie uma nova:
git checkout -b main
git remote add origin https://github.com/SEU_USUARIO/first_py.git
.gitignore
do GitHub:
git pull origin main
git add .
git commit -m "Initial commit"
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.