Empacotando e publicando pacotes Python no PyPi \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 16 Horas 

 12 Min 

 35 Seg 

   Tempo restante da oferta: 16 12 35 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Empacotando e publicando pacotes Python no PyPi  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

# Empacotando e publicando pacotes Python no PyPi

 Neste artigo iremos aprender como funciona o processo de empacotar e distribuir nossos próprios pacotes Python no PyPi.

 [ Cleyson Lima ](https://www.treinaweb.com.br/blog/autor/cleyson-lima) 4 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/07161700/gerenciamento-python.png)  

O Python é uma linguagem de programação bastante popular e robusta, que possui diversos pacotes para nos ajudar nos mais diferentes tipos de tarefas, não atoa o Python é conhecido como uma linguagem que possui baterias inclusas. Porém, nem sempre o Python irá possuir um pacote pronto para realizar as tarefas que precisamos e isso é facilmente solucionado com a possibilidade de instalarmos novos pacotes com o [pip](https://www.treinaweb.com.br/blog/gerenciando-pacotes-em-projetos-python-com-o-pip) (package installer for Python).

 [ ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/10/E-BOOK-GRATUITO-PYTHON.jpg) ](https://www.treinaweb.com.br/ebook/guia-python/)

Mas, você já se perguntou como podemos criar e disponibilizar os nossos próprios pacotes? Pois nesse artigo iremos falar exatamente sobre isso, como podemos empacotar e publicar nossos próprios pacotes no [PyPi](https://pypi.org/) (Python Package Index).

[  ![Python - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/python.svg)   Curso Python - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/python-fundamentos)

## Projeto Base

Primeiramente precisamos de algum código Python que queremos disponibilizar para a comunidade, para não termos que perder tempo desenvolvendo um projeto do zero irei disponibilizar a base do projeto pronta para podermos focar apenas nas partes necessárias para o processo de empacotamento e publicação.

### Baixando o projeto base

O projeto que iremos utilizar é o twblog, uma simples CLI (command line interface) que consegue listar e detalhar os últimos artigos publicados no blog da TreinaWeb. Para baixar o projeto base basta acessar o repositório [treinaweb-artigo-publicacao-pacotes-python](https://github.com/treinaweb/treinaweb-artigo-publicacao-pacotes-python) disponível no GitHub da TreinaWeb e realizar o download da [release intitulada “Projeto base”](https://github.com/treinaweb/treinaweb-artigo-publicacao-pacotes-python/releases/tag/v1.0).

![Print da página do GitHub mostrando a release intitulada projeto base do pacote twblog-reader](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/print-release-projeto-base-github.png)

Uma vez que tenha realizado o download do arquivo de código-fonte no formato `zip` ou `tar.gz` basta descompactá-lo e então abrir o projeto no [editor de código](https://www.treinaweb.com.br/blog/principais-editores-de-codigo-para-desenvolvimento) ou [IDE](https://www.treinaweb.com.br/blog/o-que-e-uma-ide-ambiente-de-desenvolvimento-integrado) de sua preferência.

### Preparando o ambiente

[  ![Python - Orientação a objetos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/python.svg)   Curso Python - Orientação a objetos Conhecer o curso ](https://www.treinaweb.com.br/curso/python-orientacao-a-objetos)

Agora que já baixamos o projeto base e estamos com o mesmo aberto no nosso editor de código ou IDE, nós precisamos criar e ativar uma virtualenv para podermos instalar as dependências do projeto de maneira isolada.

Para criar e ativar a virtualenv vamos executar os seguintes comandos no terminal:

- No Linxu e MacOS

```bash
python3 -m venv .venv
source .venv/bin/activate

```

- No Windows

```bash
python -m venv .venv
.venv\Scripts\activate

```

Agora que estamos com a virtualenv criada e ativada precisamos instalar as dependências do projeto, para isso executamos o seguinte comando:

```bash
pip install -r requirements.txt

```

Como isso já temos o necessário para que o projeto funcione em nossa máquina, mas para termos certeza, vamos testá-lo. Esse projeto possui duas funcionalidades, a primeira é a de listar os últimos artigos publicados no blog e a segunda é a de exibir a texto de um dos artigos listados na funcionalidade anterior.

Para executar a primeira funcionalidade podemos executar o comando `python -m twblog_reader`, após a execução deste comando será exibido uma lista dos últimos 16 artigos publicado no blog. Agora vamos testar a funcionalidade de exibir o texto de um dos artigos com o comando `python -m twblog_reader 0`, onde `0` é o número do artigo com base na listagem do comando anterior, após a execução do comando será exibido no terminal o texto do artigo em questão em formato Markdown.

## Preparando o pacote para publicação

Agora que já conhecemos o projeto que iremos empacotar e publicar no PyPi e que também garantimos que nosso ambiente está devidamente configurado e o projeto está funcionando. Nós iremos preparar o nosso projeto para que ele contenha os arquivos e configurações necessárias para que o mesmo passe pelo processo de empacotamento.

### Adicionando a licença

Se estamos disponibilizando um pacote para que outras pessoas possam utilizar, é essencial adicionar uma licença que defina de forma clara o que outras pessoas podem fazer com o nosso pacote. Uma licença é um documento legal, geralmente nós não escrevemos esse documento, ao invés disso escolhemos uma licença já existente e então a utilizamos.

Para ajudar nesse processo de escolha de qual licença utilizar recomendo o site [choosealicense.com](https://choosealicense.com/), esse site consegue indicar uma licença open source com base nas suas necessidades.

Para esse projeto eu quero uma licença que seja simples e bastante permissiva, ou seja, que possibilite outras pessoas de replicarem, modificarem e até mesmo distribuírem o projeto sem muitas restrições. Nesse contexto o [choosealicense.com](http://choosealicense.com) recomenda a licença do MIT, então será ela que iremos utilizar.

Para adicionarmos uma licença em nosso projeto basta que criemos um arquivo chamado `LICENSE` e dentro deste arquivo iremos colocar o seguinte conteúdo:

```
MIT License

Copyright (c) [year] [fullname]

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

```

> Lembre-se de alterar `[year]` pelo ano atual e `[fullname]` pelo seu nome.

Após a adição do arquivo `LICENSE` teremos a seguinte estrutura de arquivos e pastas:

```
.
├── LICENSE
├── requirements.txt
└── twblog_reader
    ├── __init__.py
    ├── __main__.py
    ├── entities.py
    ├── feed.py
    └── ui.py

```

### Criando o README.md

[  ![Python - SQLAlchemy ORM](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/python.svg)   Curso Python - SQLAlchemy ORM Conhecer o curso ](https://www.treinaweb.com.br/curso/python-sqlalchemy)

Com a licença adicionada nós já informamos o que outras podem fazer com o nosso pacote, mas também é necessário informar para essas pessoas sobre o quê nosso pacote se trata, quais funcionalidades o mesmo possui, ou seja, precisamos de uma documentação básica do nosso pacote.

Essa documentação básica pode ser criada através de um arquivo chamado `README.md`, esse é um arquivo em formato markdown onde iremos colocar informações importantes para as pessoas que irão utilizar o nosso projeto, podemos informar, por exemplo, quais as funcionalidades disponíveis a partir da instalação do nosso pacote.

Então, vamos criar um arquivo `README.md` com o seguinte conteúdo:

```markdown
# TWBlog Reader

Esse é uma simples CLI (Command Line Interface) para ler os artigos do blog da [TreinaWeb](https://treinaweb.com.br/blog). Esse projeto foi desenvolvido para o artigo [Empacotando e publicando pacotes Python](https://treinaweb.com.br/blog/empacotando-e-publicando-pacotes-python/).

## Instalação

Para instalar o pacote, basta executar o comando abaixo:

pip install twblog

## Uso

Após a instalação do pacote será disponibilizado o comando `twblog` na linha de comando. Para ver a lista do dezesseis últimos artigos, basta executar o comando abaixo:

twblog

A saída será parecida com a abaixo:

Últimos artigos do blog da TreinaWeb:

0 - Desenvolvedor mobile: por que investir nessa carreira?
1 - ASP.NET - Conhecendo a Minimal API
2 - Como se preparar para entrevistas técnicas
3 - Seletores avançados do CSS
4 - Criando o primeiro CRUD com NestJS
5 - Seletores Básicos do CSS
6 - Orientação a objetos em Dart
7 - 5 dicas para entrevistas na área de TI
8 - Novos recursos do ECMAScript 2022
9 - O que preciso conhecer antes de iniciar estudos em uma linguagem de programação?
10 - Criando o primeiro CRUD com FastAPI
11 - Unidades de medidas no CSS
12 - Orientação a objetos no C#
13 - Guia da linguagem C#
14 - Estruturas condicionais e de repetição no C#
15 - Conhecendo variáveis e constantes no C#

Para ver o conteúdo de um artigo específico, basta executar o comando abaixo:

twblog [id]

Onde `[id]` é o identificador do artigo que você deseja ver. Por exemplo, para ver o artigo de identificador 5, basta executar o comando abaixo:

twblog 5

## Licença

Esse projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.

```

Veja que nesse exemplo de `README.md` temos informações sobre do que se trata o projeto, como ele pode ser instalado e também como ele pode ser utilizado. Além dessas informações, é comum haver outras seções com informações de como outras pessoas podem contribuir com o projeto, quem são os contribuidores e mantenedores do projeto, entre outras informações.

Após a adição do `README.md` a nossa estrutura de pastas e arquivos ficará da seguinte maneira:

```
.
├── LICENSE
├── README.md
├── requirements.txt
└── twblog_reader
    ├── __init__.py
    ├── __main__.py
    ├── entities.py
    ├── feed.py
    └── ui.py

```

### Configurando o build do pacote

[  ![Python -  Arquivos e I/O](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/python.svg)   Curso Python - Arquivos e I/O Conhecer o curso ](https://www.treinaweb.com.br/curso/python-arquivos-e-io)

Agora nós precisamos configurar o nosso pacote para publicação, nessa configuração nós precisamos informar dois tipos de informação:

1. Configuração do sistema de build;
2. Configuração do pacote.

O sistema de build é responsável por criar os arquivos que de fato serão enviados para o PyPi, geralmente esses arquivos estão no formato [wheel](https://packaging.python.org/en/latest/glossary/#term-Wheel) ou no formato [source distribution (sdist)](https://packaging.python.org/en/latest/glossary/#term-Source-Distribution-or-sdist). Por um bom tempo esse processo era realizado a partir da criação um arquivo chamado `setup.py`, porém a partir da criação da [PEP 517](https://peps.python.org/pep-0517/) e da [PEP 518](https://peps.python.org/pep-0518/) essa configuração é feita a partir de um arquivo chamado `pyproject.toml`, além disso, a partir da criação dessas PEP’s também se tornou possível utilizar outros sistemas de build para realizar o empacotamento de projetos Python além do [distutils](https://docs.python.org/3/library/distutils.html) e do [setuptools](https://pypi.org/project/setuptools/).

Inicialmente iremos colocar no arquivo `pyproject.toml` informações que digam para os sistemas de build “frontend” como pip e build qual o sistema de build “backend” deve ser utilizado para criar os arquivos de distribuição do nosso pacote. Nesse artigo iremos utilizar como sistema de build “backend” o setuptools, porém é possível escolher outros sistemas de build como [Hatchling](https://pypi.org/project/hatchling/), [Flit](https://flit.pypa.io/en/stable/), [PDM](https://pdm.fming.dev/latest/), [Poetry](https://python-poetry.org/), entre outros.

Vamos criar o arquivo `pyproject.toml` e inicialmente iremos colocar o seguinte conteúdo:

```toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

```

Esse arquivo tem o formato [TOML](https://toml.io/en/) e incialmente criamos a seção `[build-system]` que informa qual o “backend” de build a ser utilizado, no nosso caso estamos utilizando o setuptools na versão 61.0 ou superior, nessa seção temos as seguintes configurações:

- `requires`: é uma lista de pacotes necessários para realizar o build do pacote. Nós não precisamos realizar a instalação desses pacotes, os sistemas de build “frontend” como o pip se encarregam realizar a instalação desses pacotes de maneira temporária e em um ambiente virtual isolado durante o processo de build;
- `build-backend`: o nome do objeto Python que o sistema de build “frontend” irá utilizar para realizar o build.

### Configurando os metadados do projeto

Agora que já temos a configuração de como irá funcionar o processo de build, nós também precisamos informar os metadados do projeto, os metadados são informações sobre o nosso projeto, como o nome, descrição, autores, dependências e entre outras informações.

Os metadados do projeto também são informados no arquivo `pyproject.toml`, então vamos abrir novamente esse arquivo adicionar o seguinte conteúdo logo abaixo do que já existe:

```toml
[project]
name = "twblog"
version = "0.1.0"
description = "Um simples leitor de artigos do blog da TreinaWeb"
readme = "README.md"
authors = [
    { name = "Cleyson Lima", email = "cleyson.lima@treinaweb.com.br" }
]
license = { file = "LICENSE" }
classifiers = [
    "Environment :: Console",
    "License :: OSI Approved :: MIT License",
    "Natural Language :: Portuguese (Brazilian)",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Topic :: Utilities",
]
keywords = ["twblog", "treinaweb", "blog", "terminal", "cli"]
requires-python = ">=3.9"
dependencies = ["requests>=2.28.1", "html2text>=2020.1.16", "beautifulsoup4>=4.11.1"]

```

Agora nós temos a seção `[project]` que contém os metadados do projeto, com as seguintes informações:

- `name`: é o nome de distribuição do nosso pacote. Pode ser qualquer nome desde que contenha apenas letras, números, `.`, `_` e `-`. Também não pode ser um nome já utilizando por outro pacote no PyPi;
- `version`: é a versão do pacote. Recomendo a leitura da [PEP 440](https://peps.python.org/pep-0440/) que define o esquema de identificação de versões de projetos e pacotes Python. Também recomendo a leitura da especificação [Semantic Version](https://semver.org/);
- `description`: é um pequeno resumo de apenas uma única sentença sobre o pacote;
- `authors`: é usado para identificar as pessoas autoras do pacote, basicamente é uma lista de objetos onde passamos o nome e e-mail de cada uma das pessoas autoras;
- `readme`: é o caminho de onde está localizado o arquivo que contem a descrição detalhada de nosso pacote;
- `license`: é o caminho do arquivo de licença;
- `classifiers`: é uma forma de passar informações adicionais para o PyPi realizar uma melhor categorização do nosso pacote. Aqui devemos pelo menos informar quais as versões do Python que são suportadas, qual a licença utilizada e quais sistemas operacionais suportados. Caso queira ver a lista completa do classifiers disponíveis acesse https://pypi.org/classifiers/;
- `keywords`: aqui informamos palavras-chave para ajudar na indexação do nosso pacote no PyPi, dessa forma fica mais fácil de outras pessoas conseguirem encontrar o nosso pacote com um simples busca;
- `requires-python`: é a versão do Python suportado pelo pacote, ou seja, o nosso pacote só pode ser utilizado em instalações do Python iguais ou superior à versão 3.9;
- `dependecies`: aqui informamos quais pacotes necessitam ser instalados em conjunto para que o nosso pacote possa funcionar corretamente. Quando alguém realizar a instalação do nosso pacote, o pip irá baixar os pacotes descritos nessa parte de forma automática. Inclusive essa configuração substitui a necessidade de termos um arquivo `requirements.txt` em nosso projeto.

> Importante lembrar que na propriedade `name` é necessário colocar um nome não utilizado por nenhum projeto no PyPi, logo, caso você queira colocar o projeto na sua conta do PyPi é necessário colocar um valor diferente de twblog na propriedade `name` do seu projeto, pois esse nome já está utilizado na minha conta do PyPi.

Essas foram apenas alguns metadados que podemos informar sobre o nosso projeto, existem várias outros metadados que podem ser informados, mas esses são os mais utilizados, caso queira saber mais detalhes sobre a seção de metadados recomendo a leitura da [especificação sobre metadados de projetos Python](https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata).

### Criando um comando para nosso pacote

Até o momento nós já temos toda a configuração necessário para dar início aos processos de empacotamento e distribuição do nosso pacote, porém esse pacote será uma CLI, ou seja, assim que ele for instalado queremos que ele adicione um comando executável pelo terminal e para isso precisamos adicionar mais uma seção de configuração ao arquivo `pyproject.toml`, então iremos adicionar mais esse conteúdo neste arquivo:

```toml
[project.scripts]
twblog = "twblog_reader.__main__:main"

```

Agora nós temos mais uma seção que é a `[project.scripts]`, nessa seção iremos informar quais são os scripts do nosso pacote, basicamente definimos uma chave chamada `twblog` que será o nome comando disponível após a instalação do pacote e como valor colocamos uma string que aponta para o que deve ser executado. A string `"twblog_reader.__main__:main"` informa que será executando uma função chamada `main` que está localizada em um arquivo chamado `__main__.py` que, está localizado na pasta `twblog_reader`.

Agora vamos testar se esse comando de fato irá funcionar, para isso podemos realizar a instalação do nosso próprio pacote localmente sem necessidade de antes colocá-lo no PyPi. Para isso podemos executar o seguinte comando no terminal:

```bash
pip install -e .

```

Como o comando acima estamos falando para o pip realizar a instalação dos pacotes definidos na pasta atual, por isso o `.` ao final do comando. Já a flag `-e` é para que a instalação do nosso pacote seja realizada de maneira editável, isso faz com que ao realizar alguma modificação no código a versão instalada localmente já será atualizada de maneira automática sem a necessidade de reexecutar o comando.

Após o comando de instalação realizado acima podemos chamar o comando que foi definido no nosso pacote, para testarmos basta executar o comando `twblog` e veremos que temos o mesmo comportamento de quando executamos o nosso projeto utilizando diretamente o interpretador do Python logo no começo desse artigo, só que agora ele é executando como um comando disponível no terminal.

## Gerando os arquivos de distribuição

Agora que já temos tudo devidamente configurado e testado nós precisamos gerar os arquivos de distribuição, esses arquivos é que serão de fato enviados para publicação no PyPi. Para gerar esses arquivos nós iremos utilizar uma ferramenta chamada [build](https://pypi.org/project/build/).

Então, para gerarmos esses arquivos nós precisamos primeiro realizar a instalação da ferramenta build, para isso execute o seguinte comando:

```bash
pip install build

```

Agora que temos a ferramenta build instalada nós iremos utilizá-la para gerar os arquivos de distribuição, para isso iremos executar o seguinte comando:

```bash
python -m build

```

Veja que após a execução do comando acima houve a criação de pastas e arquivos dentro do nosso projeto, fazendo com que o mesmo fique com a seguinte estrutura de pastas e arquivos:

```
.
├── LICENSE
├── README.md
├── dist
│   ├── twblog-0.1.0-py3-none-any.whl
│   └── twblog-0.1.0.tar.gz
├── pyproject.toml
├── requirements.txt
├── twblog.egg-info
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   ├── dependency_links.txt
│   ├── entry_points.txt
│   ├── requires.txt
│   └── top_level.txt
└── twblog_reader
    ├── __init__.py
    ├── __main__.py
    ├── entities.py
    ├── feed.py
    └── ui.py

```

Foram criadas as pastas `twblog.egg-info` que contém arquivos com informações sobre o nosso projeto, informações essas utilizadas pela própria ferramenta de build que estamos utilizando e também foi criada a pasta `dist` que contém os arquivos que de fato serão enviados para o PyPi.

## Distribuindo nosso pacote no PyPi

Agora que já realizamos o build do projeto e geramos os arquivos para distribuição, podemos devidamente realizar o envio desses arquivos para o PyPi.

### Criando uma conta no PyPi

Para podermos realizar o envio do nosso pacote para o PyPi é necessário realizar a criação de uma conta. Para realizar o registro acesse o seguinte link: https://pypi.org/account/register/, preencha todas as suas informações e por fim clique no botão “Create account”.

![Print da página de registro de conta no PyPi](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/print-pagina-registro-pypi.png)

Após o processo de criação da sua conta, você receberá um e-mail de confirmação e então basta clicar no link enviado por e-mail para realizar a confirmação da conta. Feito isso a sua conta no PyPi já está criada e então podemos dar prosseguimento com o processo de publicação do nosso pacote.

### Publicando o pacote no PyPi

Para realizar a publicação do nosso pacote, ou seja, o envio dos arquivos gerados pela ferramenta build, nós iremos utilizar outra ferramenta chamada [twine](https://pypi.org/project/twine/). Primeiro, precisamos realizar a sua instalação com o comando:

```bash
pip install twine

```

Agora que temos o twine instalado, nós vamos utilizá-lo para realizar o envio do nosso pacote para o PyPi com o seguinte comando:

```bash
python -m twine upload dist/*

```

Após a execução do comando acima o twine irá perguntar qual o seu usuário e senha registrados no PyPi, após informar qual seu usuário e senha irá aparecer no seu terminal uma mensagem como essa:

```bash
Uploading twblog-0.1.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.8/12.8 kB • 00:00 • 42.1 MB/s
Uploading twblog-0.1.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.8/10.8 kB • 00:00 • 42.1 MB/s

View at:
https://pypi.org/project/twblog/0.1.0/

```

Veja que foi realizado o upload dos dois arquivos contidos na pasta `dist` e logo em seguida o twine informa qual o link do PyPi que contém o nosso pacote, então vamos acessar esse link e ver se de fato nosso pacote foi publicado no PyPi.

Ao acessar o link https://pypi.org/project/twblog/0.1.0/ veremos a seguinte página:

![Print da página de detalhes do projeto twblog no PyPi](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/09/print-pagina-projeto-twblog-pypi.png)

Veja que todas as informações definidas nos arquivos `LICENSE`, `README.md` e `pyproject.toml` estão sendo exibidas na página de detalhes do nosso pacote do PyPi.

## Utilizando nosso pacote recém-publicado

[  ![Clean Code e SOLID - Escrevendo código limpo e escalável](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/clean-code.svg)   Curso Clean Code e SOLID - Escrevendo código limpo e escalável Conhecer o curso ](https://www.treinaweb.com.br/curso/clean-code-e-solid-escrevendo-codigo-limpo-e-escalavel)

Agora que temos o nosso pacote devidamente publicado podemos testar se é possível realizar a sua instalação via pip. Para isso vamos abrir um novo terminal e executar o comando:

- No Linux e MacOS

```bash
sudo pip3 install twblog

```

- No Windows

```bash
pip install twblog

```

Após a execução do comando acima o pip irá até o PyPi e então irá realizar o download do nosso pacote e realizar a sua instalação em nosso ambiente, após o processo de instalação podemos executar o comando `twblog` para executar o nosso pacote e conseguir ler os últimos artigos do blog da TreinaWeb diretamente pelo terminal.

## Conclusão

Neste artigo vimos todas as etapas para realizarmos o empacotamento e publicação de nossos próprios pacotes no PyPi, vimos as diferentes ferramentas e conceitos envolvidos em todo esse processo. Pode parecer algo extremamente complexo à primeira vista, mas uma vez que você tenha entendido sobre cada uma dessas etapas e tiver praticado publicando seus próprios pacotes, verá que não é nada tão difícil de ser realizado, eu diria até que é um processo mais trabalhoso do que difícil, principalmente pelo fato de que algumas etapas ainda são feitas de forma manual, como, por exemplo, a criação do arquivo `pyproject.toml`.

Aqui fica a minha recomendação para que você estude sobre outras ferramentas que tornam todo esse processo mais automatizado e cuidam de todas essas etapas para você, algumas dessas ferramentas são Hatchling, Flit, PDM, e Poetry, sendo o Poetry a que eu particularmente mais gosto de utilizar, inclusive pretendo futuramente trazer um novo artigo só para falar sobre ele.

Caso queira aprender mais sobre o Python, saiba que aqui na [TreinaWeb](https://www.treinaweb.com.br/) nós temos a formação [Desenvolvedor Python](https://www.treinaweb.com.br/formacao/desenvolvedor-python) que possui **51h03 de vídeo** e um total de **354 exercícios**.

Veja quais são os cursos que fazem parte desta formação:

- Python - Fundamentos
- Python - Orientação a objetos
- Python - Algoritmos - Parte 1
- Python - Estrutura de dados - Parte 1
- Python - Estrutura de dados - Parte 2
- Python - Collections
- Projeto de Banco de dados - Fundamentos
- MySQL - Desenvolvedor
- Python - Banco de dados com DB API
- Python - SQLAlchemy ORM
- Python - Arquivos e I/O
- Python - Consumindo APIs
- Python - Fundamentos de Kivy

- [ #Python ](https://www.treinaweb.com.br/blog/tag/python)
- [ #pip ](https://www.treinaweb.com.br/blog/tag/pip)
- [ #pacotes python ](https://www.treinaweb.com.br/blog/tag/pacotes-python)
- [ #pypi ](https://www.treinaweb.com.br/blog/tag/pypi)
- [ #setuptools ](https://www.treinaweb.com.br/blog/tag/setuptools)

Autor

 ![Cleyson Lima](//secure.gravatar.com/avatar/db30efb102ffa5d5204cebe12060b111?d=mm)

## Cleyson Lima

 Professor, programador, fã de One Piece e finge saber cozinhar. Cleyson é graduando em Licenciatura em Informática pelo IFPI - Campus Teresina Zona Sul, nos anos de 2019 e 2020 esteve envolvido em vários projetos coordenados pela secretaria municipal de educação da cidade de Teresina, onde o foco era introduzir alunos da rede pública no mundo da programação e robótica. Hoje é instrutor dos cursos de Spring na TreinaWeb, mas diz que seu coração sempre pertencerá ao Python. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/cleyson-lima)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/05/03175136/NET-CORE-2.1-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Global Tools no .NET Core 2.1 ](https://www.treinaweb.com.br/blog/global-tools-no-net-core-2-1) 

     Conheça o recurso de global tool adicionado na versão 2.1 do .NET Core e aprenda como definir uma a partir de um projeto console.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/03/01133925/javascript-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     9 anos atrás

    ##  [ O que se pode fazer com JavaScript hoje em dia? ](https://www.treinaweb.com.br/blog/o-que-se-pode-fazer-com-javascript-hoje-em-dia) 

     Conheça as várias áreas onde podemos trabalhar com JavaScript além do navegador.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/GUIA-LINGUAGEM-JAVASCRIPT-400x280.png)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     6 anos atrás

    ##  [ Guia da Linguagem JavaScript ](https://www.treinaweb.com.br/blog/guia-da-linguagem-javascript) 

     Neste Guia da Linguagem Javascript vamos abordar aspectos fundamentais, como: tipos de dados, variáveis, objetos, arrays e muito mais.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/04160959/instalador-aplicacoes-windows-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     7 anos atrás

    ##  [ Criando um instalador para distribuir suas aplicações Windows ](https://www.treinaweb.com.br/blog/criando-um-instalador-para-distribuir-suas-aplicacoes-windows) 

     Existe uma gama de ferramentas que permitem a criação de um instalador do Windows. Neste artigo veja como criar um de forma simples utilizando o Inno Setup.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/14160941/PROTEÇÃO-APP-MALICIOSOS-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     7 anos atrás

    ##  [ Dicas para proteger seus dados de aplicativos maliciosos ](https://www.treinaweb.com.br/blog/dicas-para-proteger-seus-dados-de-aplicativos-maliciosos) 

     Neste artigo veremos algumas dicas de como proteger seus dados de aplicativos maliciosos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2024/01/WEB-JARS-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ WebJars: Simplifique o gerenciamento de dependências front-end ](https://www.treinaweb.com.br/blog/webjars-simplifique-o-gerenciamento-de-dependencias-front-end) 

     Otimize seu desenvolvimento Java! Descubra como o WebJars simplifica o gerenciamento de dependências front-end. Integre com facilidade e eficiência.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/06/CSS-IN-JS-400x280.jpg)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     3 anos atrás

    ##  [ CSS in JS ](https://www.treinaweb.com.br/blog/css-in-js) 

     Veja neste artigo o CSS in JS, a técnica que permite escrever estilos CSS no JavaScript, deixando a aplicação flexível e modularizada.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/10/24165940/chatbot-400x280.png)  [ Algoritmos ](https://www.treinaweb.com.br/blog/categoria/algoritmos) 

     8 anos atrás

    ##  [ Criando um Chatbot com Python ](https://www.treinaweb.com.br/blog/criando-um-chatbot-com-python) 

     Veja neste artigo como criar um Chatbot utilizando o Python.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/11/12104935/VIRTUALENV-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     8 anos atrás

    ##  [ Criando ambientes virtuais para projetos Python com o Virtualenv ](https://www.treinaweb.com.br/blog/criando-ambientes-virtuais-para-projetos-python-com-o-virtualenv) 

     Neste artigo veremos como criar e utilizar as virtualenvs para isolar nossos ambientes de desenvolvimento python e, assim, instalar diferentes versões de uma mesma biblioteca.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/04/o-que-e-o-composer-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     5 anos atrás

    ##  [ Como instalar um pacote com Composer e utilizá-lo em seu projeto PHP ](https://www.treinaweb.com.br/blog/como-instalar-um-pacote-com-composer-e-utiliza-lo-em-seu-projeto-php) 

     Aprenda a instalar e utilizar o gerenciador de dependências Composer e dê o próximo passo rumo a se tornar um desenvolvedor PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/07161700/gerenciamento-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Gerenciando pacotes em projetos Python com o PIP ](https://www.treinaweb.com.br/blog/gerenciando-pacotes-em-projetos-python-com-o-pip) 

     Veja neste artigo como gerenciar pacotes para seus projetos Python utilizando o PIP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/instalacao-do-python-no-windows-linux-e-macos-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     6 anos atrás

    ##  [ Instalação do Python e nosso primeiro Olá Mundo ](https://www.treinaweb.com.br/blog/instalacao-do-python-e-nosso-primeiro-ola-mundo) 

     Neste artigo vamos ver como realizar a instalação do Python nos sistemas Windows, Linux e MacOS. Além disso, vamos ver como escrever e executar nosso primeiro programa com a linguagem Python.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **16h 12min 35s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
