Manual
do
Maker
.
com
O Python é uma linguagem interpretada. Isso significa que escrevemos o código em um script com extensão .py e então chamamos o interpretador para executá-lo. Ou ainda, podemos dar um bit de execução ao script e chamá-lo com ./seuScript.py em Linux. Mas uma coisa que muitas pessoas gostariam de fazer é compilar programas escritos em Python para não distribuir código ou para deixar a execução mais rápida. Bem, vou mostrar uma das técnicas utilizadas, que é gerar uma biblioteca para importar em outro script e assim uma parte do código que seja propriedade intelectual ou simplesmente para evitar mãos curiosas esteja protegida. E vamos fazer no Raspberry.
A primeira coisa a fazer é instalar o Cython. Para isso, execute a sequência de comandos abaixo em um terminal Linux:
sudo apt-get update
sudo apt-get install cython
Após instalado, já podemos começar o primeiro teste.
O arquivo de setup pode receber outros parâmetros, mas aqui vamos fazer um "hello world" apenas para mostrar como utilizar o Cython para compilar programas escritos em Python e gerar uma biblioteca a ser importada em outro script. Podemos gerar também binários stand alone, mas vamos devagar.
Crie um arquivo chamado setup.py e coloque o seguinte conteúdo:
#!/usr/bin/env python
# # -*- coding: UTF-8 -*-
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("dobitaobyte.pyx"),)
Repare que o script de setup está apontando para um arquivo chamado dobitaobyte.pyx.
Agora podemos criar u script Python qualquer, importar bibliotecas etc. Para essa compilação de exemplo, chamei o script Python com o nome dobitaobyte.py, escrevi o código, testei, então renomeei o arquivo para dobitaobyte.pyx.
O conteúdo desse script ficou assim:
#!/usr/bin/env python
# # -*- coding: UTF-8 -*-
from __future__ import print_function
import os
def homes():
'''Imprime os homes dos usuarios do sistema'''
print('usuarios no home: ', end=' ')
print(os.listdir('/home'))
def nome(myName):
'''Imprime um nome passado como parametro'''
print("Seu nome: {}".format(myName))
if __name__ == '__main__':
nome('djames')
Escrevi desse jeito para poder explicar alguns detalhes importantes.
A primeira coisa a notar nesse script, de cima para baixo, é o from future import print_function. Como o script é Python2, foi necessário importar o print para se comportar como o do Python3.
Na função homes serão exibidos os homes existentes em /home.
Na função nome, imprimimos o nome do usuário passado como parâmetro de função. Daí a penúltima linha if name == 'main': significa que se o script estiver sendo executado diretamente, ele deve chamar a função nome com o parâmetro 'djames'. Se for importado dentro de outro script, ele não executa nada.
Agora podemos compilar com o seguinte comando:
python setup.py build_ext --inplace
Assim, geraremos nossa biblioteca no mesmo diretório em que chamamos o compilador.
Agora podemos importar e testar a biblioteca. Aqui estou usando o bpython para fazer o teste in flow. Chamando a função help(dobitaobyte)(após importá-lo com import dobitaobyte) vemos as funções disponíveis em nossa biblioteca:
A primeira dica foi essa. A segunda dica é...
Como sempre, sugiro a compra do Raspberry com nosso parceiro CurtoCircuito, que tem além de Raspberry, diversos outros componentes importantes e úteis para makers, como uma gama incrível de sensores.
Em breve teremos mais artigos relacionados a Raspberry, prepare seu coração (e seu bolso, porque certamente quererá ter mais uma novidade).
Até a próxima!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.