Executando Código Python

Autor: rubens
Data: 26/03/2009

A diretiva code

Esta diretiva permite a execução de código Python no momento em que a página HTML é criada e a inclusão no documento de imagens e textos criados pelo código. O código é executado por um processo separado que chamamos de Sandbox de Execução. A execução se dá em um ambiente controlado no qual se impõe diversas restrições. Não é permitido, por exemplo:

  • escrever no sistema de arquivos
  • ler arquivos, a não ser de alguns locais;
  • abrir sockets de comunicação;
  • lançar processos;
  • utilizar signals.

Se isto for feito, aparecerá uma mensagem de erro.

O ambiente de execução

O ambiente de execução conta com um conjunto de objetos previamente carregados no espaço de nomes global:

  • numpy:
    • import numpy
    • from numpy import *
  • morph:
    • import morph
    • from morph import *
  • adpil
    • import adpil
    • from adpil import *
  • ia636
    • import ia636_numpy
    • from ia636_numpy import *
  • PIL
    • import Image, ImageFile, ImageDraw, ImageFont

Para que o sistema seja capaz de obter e utilizar recursos criados pelo código do usuário, algumas funções são sobrecarregadas para capturar imagens e textos.

  • Captura de imagens criadas pelo código:

    adshow:

    função de adpil

  • Leitura de imagens:

    adread:

    função de adpil

    adreadgray:

    função de adpil

Parâmetros da diretiva code

As imagens criadas pelas funções acima, bem como o texto produzido na saída-padrão (via print) são inseridos no documento no local onde aparece a diretiva code. Para controlar a maneira como os recursos são inseridos, existe uma série de parâmetros, descritos a seguir.

:title: <string>
título do conjunto de imagens
:include_file: <wiki_link>
indica que o código deve ser lido do arquivo especificado através do wiki_link (deve ser um anexo)
:tex_pos: <string>
apenas para latex: btph (bottom, top, page ou here)
:show_code: <yes|no|fold>
incluir o código no documento? A opção 'fold' indica que o bloco de código deve aparecer minimizado (o link marcado com '+' (à direita) pode ser usado para mostrar o código).
:show_output: <yes|no>
incluir a saída-padrão gerada na execução do código?
:show_images: <yes|no>
incluir imagens geradas na execução do código?
:output_format: <literal|rest
indica se a saída-padrão deve ser interpretada como um fragmento de documento reST ou como texto pre-formatado
:line_number: <yes|no>
listagem de código deve ter linhas numeradas?
:img_align: left|center|right
alinhamento das imagens na página
:img_width: <int>
largura das imagens em pixels (para HTML, para LaTeX veja img_texdpi)
:img_texdpi: <int>
resolução das imagens em dpi, dot-per-inch, (para LaTeX)
:img_cols: <int>
número de colunas para as imagens
:col_span: <int_list>
lista de inteiros separados por espaço indicando o span de cada célula da tabela de imagens
:timeout: <int>
máximo intervalo de tempo para a execução do código (este parâmetro é passado ao Sandbox de Execução)

Argumentos de entrada

O código Python pode especificar argumentos de entrada. O mecanismo utilizado é o mesmo usado para argumentos de programas executados via linha de comandos: a classe OptionParser (derivada de optparse.OptionParser). Para detalhes sobre como especificar argumentos, veja a documentação do módulo Python optparse.

OptionParser causa a inclusão de um formulário HTML que permite a especificação de valores para os argumentos de entrada. Veja exemplos renavam e cpp_example.

Leitura de arquivos anexados (attachments)

Para se ler arquivos anexados que foram ou carregados manualmente, ou foram escritos por programas, é necessário utilizar a função find_attachment_file:

1. file = open(find_attachment_file("text.txt"))
2. conteudo = file.read()
3. print conteudo
4. print type(file)
5. file.close()
------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
  File "aws_python.py", line 157, in find_image_file
    raise IOError('Cannot find image: %s' % filename)
IOError: Cannot find image: text.txt

------------------------------------------------------------

É possível também escrever um novo arquivo anexado utilizando-se a função find_attachment_file. Entretanto, o arquivo criado não aparece na lista de arquivos anexados, que podem ser inspecionados pela aba de attachments. Abaixo é um exemplo onde um pequeno arquivo é criado e depois lido.

1. file = open(get_attachment_path("newfile.txt"),"w")
2. file.write("This is a new file\nThis is the second line.")
3. file.close()
4. 
5. f = open(find_attachment_file("newfile.txt"))
6. print f.read()
7. f.close()
This is a new file
This is the second line.