Como fazer uma biblioteca Python e publicar no PyPI

Contando minha experiência ao criar uma biblioteca Python e como foi publicar esse pacote Python no “Python Package Index” (PyPI)

Itanú Romero
7 min readNov 13, 2021

Fala pessoal, espero que estejam bem!

Hoje vou mostrar como foi minha experiência colocando uma biblioteca no repositório PyPi pela primeira vez. Além disso deixei bem documentado então provavelmente pode te ajudar a publicar sua biblioteca também!

Obs: Várias vezes vou chamar a biblioteca de pacote e vice-versa, para melhor entendimento pode considerar que são a mesma coisa.

Conhecendo o projeto

Pra quem está por dentro do que escrevo por aqui, podem lembrar que faz certo tempo que publiquei um texto de uma nova aplicação que estou criando, veja aqui, ela tentará ser capaz de entregar a experiência de escrever código para pessoas que possuem deficiências físicas e/ou motoras, tanto para pessoas que não sabem como utilizar o teclado ou mesmo não queiram utilizar no momento. A ideia é usar um sistema de reconhecimento de fala, que transforma isso em texto.

A outra parte do sistema, vai pegar esse texto, que está “formatado em linguagem natural” e transformá-lo em código python.

Porém, nesse momento eu vi que esse módulo ou conjunto de funcionalidades seria um ótimo projeto em si. Imagine que tu consiga escrever código da mesma maneira que se lê?

Claro que isso não seria avançado como a GTP-3, uma inteligência artificial que transforma linguagem natural em código, mas é possível fazer algo semelhante e muito mais simples, pois estaremos dizendo exatamente como o código deveria sair, o que é muito similar a uma linguagem de programação em si, mas não vou entrar nesse mérito no momento pra não ficar muito complexo.

Mas e o contexto?

Quando lemos um código, temos a capacidade de ver algo como

print(‘Fala pessoal’)

E lemos isso como: “print fala pessoal”, ou mesmo: “mostrar na tela fala pessoal”, mas vamos se ater ao primeiro caso. Em outro caso, podemos ver:

number = 10

Que podemos ler como “variável number é igual a 10” ou de um jeito mais simples, “number recebe 10”, isso é como podemos ler códigos.

Mas, como seria escrever códigos da maneira que se lê?

O projeto Talking Code tenta fazer isso, porém de uma maneira mais próxima ao que se escreve, por exemplo, para excrever “print(‘fala pessoal’)” é necessário dizer (entregar como entrada ao sistema) a frase:

print abre parêntesis aspas fala pessoal aspas fecha parêntesis

E assim, com métodos de replace, podemos modificar cada uma das palavras no que ela significa, sendo aspas = ‘ e fecha parêntesis = ).

O problema é que isso seria muito custoso para o usuário, e mesmo que funcione bem, talvez faça sentido criar algo que apenas aceite que a função print já acompanhe a abertura e fechamento de aspas e parêntesis.

Entendi, mas e o código? Eu falei que ia tentar fazer uma biblioteca né?

Agora que sabemos qual seria a ideia mais ou menos… Vamos pensar em como colocar isso em prática até publicar isso no “Python Package Index” (PyPI)

Primeiro, vou criar um repositório no GitHub, com o nome Talk In Code (referência ao sistema Talking Code, meu projeto que me deu essa ideia) disponível neste link.

Agora, vamos clonar esse repositório na nossa máquina local!
(Dúvidas nessa parte? Dá uma olhada nesse link)

Depois, criarei com o Pycharm um projeto dentro desse repositório clonado, então vamos ter que criar um setup.py que vai ser responsável pela mágica de transformar nossos pacotes em algo que possa ser publicado.

Lá dentro temos que importar o setuptools, e usando a ferramenta setup, vou escrever todas as informações que são necessárias para construir a aplicação como uma biblioteca, o que criei ficou mais ou menos assim:

Para copiar o conteúdo, acesse: https://github.com/ItanuRomero/talk-in-code/blob/main/setup.py

Agora podemos ver que temos um módulo python que se chama ‘talk-in-code’ e dentro dele temos o código que transforma a frase “print fala pessoal” em:

print(‘fala pessoal’)

Bora entender um pouco mais!

Criando o Pacote

Um pacote python é uma pasta que possui uma estrutura que permite que os arquivos .py que estiverem dentro dela possam ser chamados como um módulo, normalmente isso pode ser visto ao importar alguma funcionalidade, como por exemplo:

from pacote import módulo

E lá ficará nosso código que será o tradutor de linguagem natural em código Python!

Basicamente teremos o translator.py como módulo ou arquivo Python que terá as funcionalidades de tradução, enquanto o translate.py será nosso arquivo de conexão entre o translator em si. Logo, temos o translator.py:

Para copiar o conteúdo acesse: https://github.com/ItanuRomero/talk-in-code/tree/main/talk_in_code

E o translate.py como

Para copiar o conteúdo acesse: https://github.com/ItanuRomero/talk-in-code/tree/main/talk_in_code

Assim, importando o módulo translate do pacote talk_in_code teremos a funcionalidade run que permite enviar um texto de linguagem natural e retornar o conteúdo formatado como um código Python, ou seja, caso quiséssemos usá-lo em outro sistema, teríamos de fazer:

from translate import translate
translate.run(‘print fala pessoal’)

E o retorno seria:

print(‘fala pessoal’)

Continuando com o processo de criação da biblioteca

Com tudo criado, precisamos instalar (ou atualizar) o wheel, uma funcionalidade que fará com que nosso sistema consiga ser construído no formato de biblioteca, para isso rode no seu terminal:

pip3 install setuptools wheel

Dica: Leia a documentação!
- https://pypi.org/project/wheel/

Depois, para gerar os arquivos de distribuição, precisamos rodar o comando a seguir no diretório raiz do projeto

python setup.py sdist bdist_wheel

Depois de rodar esse comando, poderá ver que são criadas as pastas build e dist dentro do seu diretório raiz, também teremos uma pasta nome_do_modulo.egg-info dentro de seu pacote (no nosso caso, o translate). Ficando algo próximo a isto:

Agora, os arquivos de distribuição estão prontos, e nós podemos instalar e importar o pacote criado, assim testamos se tudo ocorreu bem.

Para instalar, usaremos o comando

pip3 install -e .

Se tudo der certo, teremos algo como isso em retorno

Agora acesse o Python como linha de comando e vamos tentar acessar essa biblioteca:

Pode ver que ele recebe a string ‘print fala pessoal, blza?’ e retorna a string “print(‘fala pessoal, blza?’)”, interessante, não?

Pra ser sincero até aqui já foi uma experiência sensacional, mas como está no título, também quero tentar publicar isso no PyPI, vamos tentar?

Publicando o pacote no TestPyPI

Para ter a experiência de publicar no PyPI, mas sem necessariamente jogar isso publicamente ‘em produção’, podemos usar o TestPyPI, e para isso primeiro precisamos nos registrar na plataforma https://test.pypi.org/, e nela vamos testar se a biblioteca está rodando bem antes de colocar no PyPI oficial!

Despois de registrado, vamos instalar o twine para ajudar a enviar esse pacote Python para o PyPI

python -m pip install twine ou pip install twine

Dica: Leia as documentações antes de usar.
- https://packaging.python.org/tutorials/packaging-projects/
- https://twine.readthedocs.io/en/latest/

Agora com o twine instalado, vamos colocar isso no testpypi!!! Rode o comando a seguir!

python -m twine upload -r testpypi dist/*

E o retorno deve ser:

E pronto, sério, que massa! Temos uma biblioteca publicada no TestPyPI!!!!!!!! Ops, muitas exclamações, mas é que pra mim isso foi muito legal!

Olha isso: https://test.pypi.org/project/talk-in-code/0.0.1/

Instalando a biblioteca desde o TestPyPI

Primeiro, temos que desinstalar a versão que instalamos localmente usando o pip install -e .

pip uninstall talk_in_code

E agora sim, instalando direto do TestPyPI.

pip install -i https://test.pypi.org/simple/ talk-in-code==0.0.1

E temos ela instalada de novo:

Agora, caso tu queira publicar ela de vez no PyPI…

Publicando o pacote no PyPI

Crie também uma conta no PyPI, e vamos usar o twine novamente para enviar a biblioteca para o repositório:

python -m twine upload dist/*

Agora dá pra instalar o pacote com o comando normal do pip!

pip install talk_in_code

É isso!

Muito obrigado por ter ficado até aqui, caso tenha feito junto comigo, para publicar seu próprio pacote, me avisa aqui nos comentários, faça o mesmo se tiver algo a adicionar.

Foi incrível ter essa experiência, e agora que eu sei como fazer essa publicação, podemos seguir melhorando essa biblioteca juntos!

Acesse o que criamos hoje:
Biblioteca no PyPI = https://pypi.org/project/talk-in-code/0.0.1/
Código e estrutura da Biblioteca: https://github.com/ItanuRomero/talk-in-code

Um abraço!

Baseado no artigo incrível do Aveek Das: How to publish a Python Package to PyPi.

--

--

Itanú Romero
Itanú Romero

Written by Itanú Romero

Software Engineer — Problem solver — Technology enthusiastic

No responses yet