Fazendo uma release de um projeto python (manualmente)

Distribuir um projeto python é complicado porque não raramente ele tem vários pacotes com dependências, pensando nisso eu fiz um mini artigo-tutorial sobre como fazer

1) Crie um ambiente virtual

Ele vai colocar em um container tudo que o seu script precisa pra funcionar ou seja, vai facilitar e muito a nossa vida, pra fazer um é extremamente simples, considerando que você já está na sua pasta de trabalho, basta rodar no terminal:

python3 -m venv  . --copies

A flag --copies ancapsua o python

2) Inicie seu ambiente virtual

No passo anterior nós criamos o ambiente virtual mas não o iniciamos, portanto vamos “entrar” nele agora, o seguinte comando inicia o ambiente virtual:

source ./bin/activate

3) Instale seus pacotes

Mesmo que você os tenha instalado no sistema eles não vão (e nem deveriam) ser carregados no ambiente virtual, mas nem se preocupe, a lógica é exatamente a mesma, você vai usar o pip pra instalar, a única diferença é que você vai usar a flag --no-cache-dir :

pip --no-cache-dir install  pacote1 pacote2 pacote3...

Por exemplo, se o seu projeto usa os pacotes request e beautifulsoup4 sua linha ficaria assim:

pip --no-cache-dir install request beautifulsoup4

Fácil né?

4) Crie ou copie o seu script

Sim, se você já fez o seu script e instalou todas as dependências dele, pode só copiar que ele vai funcionar de boas (veja as observações), pra exemplificar vou pegar o script desse tutorial sobre beautifulsoup:

import requests
from bs4 import BeautifulSoup


page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

# Usar .contents para pegar as tags <a> filhas
for artist_name in artist_name_list_items:
    names = artist_name.contents[0]
    print(names)

Nota: seu script não deve fazer chamadas para caminhos absolutos

5) Teste

Obviamente você precisa testar o seu script, basta chamar ele assim:

python3 seu_script.py

Assim como faria fora do ambiente virtual

6) Deixe seu ambiente Python portável

O ambiente funciona mas tem um problema, se você mandar ele pra outra pessoa ou mover seu ambiente pra outra pasta ele não vai funcionar, isso acontece porque atualmente ele está usando um caminho absoluto pra carregar o ambiente, pra resolver isso, use os seguintes comandos:

  1. Primeiro vamos adicionar a shebang “#!/usr/bin/env bash” no arquivo bin/activate e redirecionar a saída para bin/python3.wrap
echo '#!/usr/bin/env bash' | cat - bin/activate > bin/python3.wrap
  1. Aqui vai a mágica nós vamos substituir o caminho absoluto pela saída do comando $(dirname $(dirname $(readlink -f $0))) no arquivo bin/python3.wrap, ele pega o diretório superior de onde o script está
sed -i "s|$(pwd)|\$\(dirname \$\(dirname \$\(readlink -f \$0\)\)\)|" python3
  1. Agora nós adicionamos a chamada ao python ou seja vamos chamar o python que nós encapsumalos no passo 1:
echo '$VIRTUAL_ENV/bin/python3 ${@}' >> bin/python3.wrap
  1. Por fim nós vamos assegurar que bin/python3.wrap possa ser execuutado:
chmod +x bin/python3.wrap

Ok, mas todo esse trabalho pra que? Bem, atualmente pra nós rodarmos nosso script nós precisamos fazer isso:

source ./bin/activate
python3 seu_script.py

E ainda temos outro problema, se nós não executarmos esses comandos no exato caminho codificado em bin/activate nosso ambiente não vai funcionar, agora já ficou beeem mais simples, basta digitar:

./bin/python3 seu_script.py

E o ambiente virtual pode ser executado a partir de qualquer diretório, mas não é o suficinte

5) Criando um AppDir

Um AppDir é um diretório que contém todos os arquivos que uma aplicação precisa pra funcionar, atualmente nós tempos quase tudo faltando apenas o arquivo AppRun, ele é o responsável por iniciar o aplicativo, é um jeio padronizado de fazer, como o python configurou tudo em bin/activate nós basicamente só precisamos chamar o bin/python3.wrap, basta criar um arquivo chamado “AppRun” com esse modelo:

#!/bin/sh
HERE="$(dirname "$(readlink -f "${0}")")"
export PATH="${HERE}"/usr/bin/:"${HERE}"/usr/sbin/:"${HERE}"/usr/games/:"${HERE}"/bin/:"${HERE}"/sbin/:"${PATH}"
export LD_LIBRARY_PATH="${HERE}"/usr/lib/:"${HERE}"/usr/lib/i386-linux-gnu/:"${HERE}"/usr/lib/x86_64-linux-gnu/:"${HERE}"/usr/lib32/:"${HERE}"/usr/lib64/:"${HERE}"/lib/:"${HERE}"/lib/i386-linux-gnu/:"${HERE}"/lib/x86_64-linux-gnu/:"${HERE}"/lib32/:"${HERE}"/lib64/:"${LD_LIBRARY_PATH}"
export XDG_DATA_DIRS="${HERE}"/usr/share/:"${XDG_DATA_DIRS}"
export PERLLIB="${HERE}"/usr/share/perl5/:"${HERE}"/usr/lib/perl5/:"${PERLLIB}"
export GSETTINGS_SCHEMA_DIR="${HERE}"/usr/share/glib-2.0/schemas/:"${GSETTINGS_SCHEMA_DIR}"
export QT_PLUGIN_PATH="${HERE}"/usr/lib/qt4/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt4/plugins/:"${HERE}"/usr/lib32/qt4/plugins/:"${HERE}"/usr/lib64/qt4/plugins/:"${HERE}"/usr/lib/qt5/plugins/:"${HERE}"/usr/lib/i386-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib/x86_64-linux-gnu/qt5/plugins/:"${HERE}"/usr/lib32/qt5/plugins/:"${HERE}"/usr/lib64/qt5/plugins/:"${QT_PLUGIN_PATH}"

Agora você adiciona no final desse arquivo:

echo -e "\n" '$HERE/bin/python3 $HERE/seu_script.py "$@"' >> AppRun

Obviamente substituindo seu_script.py pelo nome do arquivo do seu script.

Pra finalizar basta tornar o arquivo AppRun executável:

chmod a+x AppRun

6) O que vem depois depende do que você quer

Agora (considerando que você esteja na pasta do ambiente virtual) você pode executar o script assim:

./AppRun

E isso abre um leque imenso de posibilidades, a partir daqui você pode fazer um AppImage, um Snap, um Flatpak, um tarball, um .deb, um .rpm… enfim, qualquer coisa

Espero que tenha sido útil e até a próxima

7 curtidas

Olá Natanael.755, tudo bem?

O senhor me ajudou sobre como instalar IDLE no Arch Linux… Bom, muito obrigada pela ajuda. O aplicativo está funcionando e anotei todas as suas informações e explicações para estudos. Porém ainda tenho algumas dúvidas…

O senhor resolveu meu problema com o comando: pacman -S tk.

De acordo com suas informações estava faltando porque não foi possível importar o módulo “Tkinter”. Então o senhor pesquisou qual pacote trazia esse módulo.

Onde e como o senhor pesquisou (eu sei, mas para além do Google), por favor qual o processo? Por favor, como posso encontrar esses módulos?

Eu não entendi… o que é um pacote e o que é um módulo? Porque os dois não estavam juntos? Eles não são a mesma coisa?

Também ao passar para o papel o texto estou tendo dificuldades para entender a parte que começa com suas explicações na parte de %karenina… O senhor disse que o caractere “;” é para controle de fluxo, é isso?

Dessa parte em diante não entendi outras coisas, mas acho melhor pesquisar e estudar. Não consigo perguntar porque não asimiliei o suficiente para elaborar perguntas…

Mas o senhor me sugeriu este texto que também já li e passei tudo para o papel, mas também está um pouco complicado…

O que seria um release?
O que seria um ambiente virtual e porque ele é necessário?
O comando python3 -m venv . --copies “–copies” está beem clarinho. Porque?
Na parte 1) Crie um ambiente virtual “A flag --copies ancapsua o python”. O que é “ancapsua”?
O que é pip?
Script é um roteiro né? Porque precisamos dele (neste caso em específico)?
Nota: seu script não deve fazer chamadas para caminhos absolutos. **O que são “caminhos absolutos”?

  1. Deixe seu ambiente Python portável.** Isso é mover ele de diretorio? Mas ele não devia ficar sempre no mesmo diretório…?

O que é encapsumalos? É algo referente a encapsular? Mas o que seria…?

Porque depois de todo este processo ainda temos “quase tudo faltando”?

Esse tutorial é para montarmos arquivos que podem ser compartihados? Tipo aplicativos?
Eu nem faço ideia de como fazer essas coisas… Eu entendi pouco sobre o processo em si também… Eu realmente preciso realizar todo este processo para estudar Python ou usar a IDLE? (ainda não tive tempo de usá-la, estou escrevendo as coisas das minhas fontes como vocês rsrsrs).

É engraçado que quanto mais estudo, mais dúvidas vem… Inclusive o são estas palavras que o senhor costuma usar, “echo”, “source” “%” são comandos né? Por favor, me diga, onde posso aprender sobre elas? Não apenas estas palavras… Onde posso estudar esse vocabulário? Existe algum dicionário?..

Bom, por enquanto é isso! Vou copiar agora as informações que o outro rapaz do fórum também passou. Muito obrigada por tudo :v: :no_mouth: :v: :heart:!

3 curtidas

Basicamente eu pesquisei, “python qual pacote traz o Tkinter no Arch” ai eu fui lendo até que uma resposta deu como sugestão o pacman, como o pacman é o gestor de pacotes do Arch, eu tinha achado o pacote, aí foi só testar

Pacote é um conjunto de arquivos, por exemplo, aquivos zip, são pacotes, um módulo é uma parte de um software, modulos geralmente vem em pactotes. E sobre eles não estarem juntos, não tem uma resposta específica, depende da distro, do módulo e do pacote. Tecnicamente não, um pacote pode trazer um ou mais módulos:

  • Pacote: conjuntos de arquivos, pode ser qualquer coisa
  • Módulo: um pedaço de um software divididos em um ou mais arquivos

Relaxa, eu fazer um post explicando passo a passo, esse é um conhecimento legal de ter mas não é tão útil

Release é quando você você distribui o software para os usuários

Ambiente virtual é um ambiente isolado do sistema onde você pode fazer suas coisas, ele é necessário porque fica muito mais fácil saber do que o seu app precisa pra funcionar e você pode simplesmente fazer uma cópia de segurança sem ter que ficar quebrando a cabeça sobre o que instalar além de facilitar fazer uma release

É uma limitação do fórum, ele deve ter pensado que o código é da linguagem lua, então formatou como se fosse um comentário… simplesmente ignore

É encapsular, eu digitei errado… basicamente ela “copia o python e coloca dentro do ambiente virtual” em outras palavras, ele encapsula o python

Python Install Package, é um software que te ajuda a instalar e remover pacotes (e por consequência Modulos) python

Porque com ele o que você instala no seu ambiente virtual, não afeta outros software feitos em python

Caminhos absolutos, são o caminho completo

Exato

Na verdade não, o ideal é que você possa mover seu ambiente de trabalho, assim fica fácil redistribuir

Exatamente, um erro de digitação, encapsular é embutir, colocar dentro algum lugar… nesse caso dentro do ambiente virtual

Na verdade só falta o AppRun, eu esqueci da vírgula

Exatamente

Relaxa, esses comandos, são tão de boas que não precisa de um dicionário, mas pra maioria deles você pode usar esse site coloca na barra e clica em “Explain”, a explicação tá em inglês mas é só copiar no Google Tradutor que resolve, você também pode usar um comando chamado “whatis”, o resultado também é em inglês, por exemplo pra saber o que o “echo” faz, basta rodar:

whatis echo
4 curtidas

ESTE É O MELHOR FÓRUM QUE JÁ VI NA VIDA!!!
Meu Deus como vcs são bons! E não estou falando de bons de inteligência!
Vcs são bons de verdade!!! Muito obrigada professor!!!

4 curtidas

Interessante, mas acho que seria mais fácil e prático usar setuptools, especialmente se seu projeto for multiplataforma.

1 curtida

Segundo a documentação do Python o meio recomendo pra fazer uma release pro usuário final é essa, setuptools é usada pra liberar o código fonte ou publicar no repositório de onde o pip baixa os pacotes, eu optei por seguir as recomendações da doc

1 curtida

Sim, ainda pode envolver dependências mais profundas, mas geralmente aplicações com dependências tão profundas não são boas candidatas nem para AppImage, Snap, Flatpak, etc… E no fim é melhor deixar para o OS ou o usuário resolverem estas questões.

Gostei muito de saber disso.
Sabe quando a gente olha pra alguma coisa e parece que o cérebro começa a dar um milhão de ideias ao mesmo tempo?