PYPI: Empacotando e distribuindo a sua aplicação Python

Esses dias estava fazendo um workshop em Python e um dos tópicos, era como empacotar e distribuir uma aplicação ou biblioteca em Python, ou seja como eu posso fazer um:

pip install minha_aplicação

E qualquer pessoa pode usa-la.

Então vamos lá.

Primeiro passo é criar o nosso script:

script/
 automation.py

Então dentro de uma pasta chamada script eu criei um arquivo python com nome automation.py.

O conteúdo dele é o seguinte:

#!/usr/bin/python3
 
print("it's working!")

Agora que já temos o nosso script, é necessário instalar 3 módulos do python para poder distribui-lo.

python3 -m pip install twine setuptools wheel

O setuptools é o que vai criar os pacotes a serem distribuidos.
O Wheel é o formato desse pacote.
E o Twine é pra fazer o upload desses pacotes para o repositórios.

Agora crie um arquivo chamado setup.py no mesmo diretório com o seguinte conteúdo.
setup.py

import setuptools
with open("README.md", "r") as fh:
    long_description = fh.read()
setuptools.setup(
     name='alisson_cli',  
     version='0.1',
     scripts=['automation.py'] ,
     author="Alisson Machado",
     author_email="alisson.machado@gmail.com",
     description="pacote criado para demonstrar o pypi",
     long_description=long_description,
   long_description_content_type="text/markdown",
     url="https://github.com/AlissonMMenezes/alisson_cli",
     packages=setuptools.find_packages(),
     classifiers=[
         "Programming Language :: Python :: 3",
         "License :: OSI Approved :: MIT License",
         "Operating System :: OS Independent",
     ],
 )

Nele temos uma série de informações, como versão, repositório, descrição, mas o mais interessante pra esse post é o scripts, nele é informado o arquivo executável da nossa aplicação, esse arquivo tem que ser um script valido dentro do diretório, que nesse caso é o automation.py.

Agora vamos criar um README.md:

Esse é um projeto teste

Com tudo pronto agora, vamos gerar o pacote a ser distribuído com o seguinte comando:

python3 setup.py sdist bdist_wheel

sdist – Source Distribuition
bdist_wheel – Built Distribuition

Assim que terminar o comando será criado um diretório chamado dist, com o conteúdo:

alisson@alisson-dell:~/workshop/dia1/scripts$ ls dist/
alissonteste-0.1-py3-none-any.whl  alissonteste-0.1.tar.gz

Veja que temos um whl e o tar.gz que é o código fonte do nosso projeto, gerado pelo parâmetro sdist.

Agora crie uma conta em: https://pypi.org/account/register/

Já com o seu cadastro finalizado e verificado execute o seguinte comando:

alisson@alisson-dell:~/workshop/dia1/scripts$ python3 -m twine upload dist/*

Enter your username: alisson.machado
Enter your password: 
Uploading distributions to https://upload.pypi.org/legacy/
Uploading alisson_cli-0.1-py3-none-any.whl
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.49k/4.49k [00:00<00:00, 5.88kB/s]
Uploading alisson_cli-0.1.tar.gz
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4.07k/4.07k [00:01<00:00, 2.95kB/s]

Veja que o upload foi feito com sucesso.

Agora para testar vamos executar o seguinte comando:

sudo python3 -m pip install alisson_cli

WARNING: The directory '/home/alisson/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/home/alisson/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting alisson_cli
  Downloading https://files.pythonhosted.org/packages/74/e1/8822f9b700105a7209159cc036c70814ad5f19cc0ef9ade1351e156eea1c/alisson_cli-0.1-py3-none-any.whl
Installing collected packages: alisson-cli
Successfully installed alisson-cli-0.1

veja que o pacote já está disponível e já foi instalado na minha máquina.

Para testar agora é só digitar o comando abaixo em qualquer diretório:

alisson@alisson-dell:~$ automation.py 
it's working!

E ai foi instalado o nosso script.

Qualquer dúvida é só dar um salve.