Manual

do

Maker

.

com

Compilar programas escritos em Python com Cython

Compilar programas escritos em Python com Cython

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.

Instalando Cython

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.

Criando o arquivo de setup

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.

Criando o script Python a ser compilado

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.

Compilar programas escritos em Python

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.

cython-build.webp

Importando e testando a biblioteca

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:

cython_lib-teste.webp

A primeira dica foi essa. A segunda dica é...

Onde comprar Raspberry?

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.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.