Servidor Web em Python pela Linha de Comando

O post da vez não é muito relacionado à programação em Python, mas poderá ajudar bastante no nosso dia-a-dia. Quantas vezes precisamos compartilhar determinado arquivo com um colega, que muitas vezes está na mesma rede que a gente? Qual a solução? Realizar o compartilhamento via Samba? Copiar o arquivo com scp? Existe um jeito bem mais simples, usando um módulo que vem instalado junto com o Python, chamado SimpleHTTPServer. Nesse módulo, há uma classe chamada SimpleHTTPRequestHandler, que é responsável por servir, via HTTP, os arquivos e sub-diretórios do diretório de trabalho atual.

Na prática, significa que podemos “levantar” um servidor web que irá listar os arquivos presentes em um diretório, para que outras pessoas possam copiar arquivos. Por exemplo, queremos compartilhar os arquivos e sub-diretórios presentes no diretório /home/user/files, então podemos proceder da seguinte forma:

cd /home/user/files
python -m SimpleHTTPServer

Após isso, basta acessar, usando um navegador Web, o endereço http://localhost:8000 , pois quando chamado sem parâmetros, o serviço é iniciado na porta 8000. É óbvio que para compartilharmos arquivos com amigos, devemos passar o endereço IP de nossa máquina, e não localhost. 😛

bPython, um shell “tunado”

Em outros posts, comentei sobre o Dreampie e sobre o iPython, ambos programas para interpretação interativa de código Python. Agora chegou a vez de outra alternativa bem legal, o bPython. O bPython é bem diferente das outras opções, começando por seu estilão ncurses de mostrar as informações.

bpython

bPython completando função

Como mostra o screenshot acima, o bPython, além de completar os nomes de funções e módulos, também mostra o texto de ajuda envolto por uma caixinha, que some assim que não for mais necessária. Isso é muito mais prático do que, por exemplo, antes de chamar uma função, executar help(função) para descobrir o que faz a função e quais são seus argumentos. Além desses recursos de ajuda, o bPython oferece diversos outros recursos, que irei sumarizar a seguir:

  • rewind: permite “voltar no tempo”. Quando executado, esse recurso reavalia a última linha.
  • show source: quando F2 é pressionado após o nome de um módulo, o bPython busca e mostra o código-fonte daquele módulo.
  • pastebin: envia o código digitado pelo usuário ao pastebin, um serviço na web para armazenamento de trechos de código.
  • Destaque de sintaxe: assim como os outros programas apresentados, o bPython também colore a sintaxe do código, a medida que vai sendo digitado.
  • Salvar código: permite salvar o código digitado no shell em um arquivo no disco.
  • Auto-indentação: o bPython indenta automaticamente a próxima linha quando, por exemplo, escrevemos um cabeçalho de função, de loop for, etc.
  • Completação de nomes de arquivos: em diversas situações, é preciso que utilizemos o caminho de arquivos do disco no código Python, como por exemplo, quando vamos abrir um arquivo com a função open. O bPython completa e mostra as opções de arquivos do disco, à medida que digitamos o caminho do arquivo.

Comparado ao iPython, o bPython possui menos recursos. Mas, para quem não vai utilizar os recursos avançados que o iPython oferece, o bPython é uma excelente alternativa. Na página oficial do projeto, existe uma página que apresenta as alternativas ao bPython e, inclusive, deixa claro que os “concorrentes” podem ser mais adequados para determinados usuários. Mais um exemplo legal em um projeto de software livre.

Mais screenshots e screencasts, veja: http://bpython-interpreter.org/screenshots

iPython, muito mais que um simples shell

O iPython não é somente mais um shell Python. Apesar de servir muito bem como um simples substituto ao shell Python padrão, existe tanta coisa por trás desse projeto que é, no mínimo, injusto caracterizá-lo apenas como uma alternativa ao shell Python padrão. Além dos esperados recursos como completação de nomes de módulos/funções, o iPython fornece um rico conjunto de funcionalidades que o tornam um ambiente de desenvolvimento e experimentação único. Vou listar algumas das funcionalidades disponíveis:

  • Execução de comandos de sistema:com uma sintaxe mais simples que uma chamada a os.system(), é possível a execução de comandos no sistema. Basta preceder o comando com o caractere de exclamação(!).
    • Exemplo: !ls -l
  • Redirecionamento de saída de comandos:é possível armazenar em uma lista o resultado da execução de um comando do sistema. Para isso, basta uma atribuição simples.
    • Exemplo: arquivos = !ls
  • Funções avançadas de histórico: atalhos específicos para execução de comandos anteriormente executados.
  • Criação de aliases (apelidos) para comandos.
  • Autoindentação: ativada por padrão, é também possível desativá-la.
  • Execução de programas Python:com apenas um comando, é possível executar um arquivo Python dentro do iPython.
    • Exemplo: %run arquivo.py
  • Avaliar tempo de execução de comandos:com um simples comando, é possível “medir” o tempo de execução de trechos de código Python.
    • Ex.: %timeit print “Hello, world!” Muitas das funcionalidades aqui apresentadas não são novidade, pois podem ser obtidas através da utilização de módulos, como o timeit, no caso dessa funcionalidade. O interessante é a praticidade para utilização desses recursos dentro do iPython.
  • Console gráfico (qt): o iPython oferece um console que pode, por exemplo, apresentar imagens inline no texto do console. Assim, é possível plotar gráficos direto no shell.
  • Computação paralela: o iPython é muito utilizado para computação científica, onde é necessária a realização de tarefas que, muitas vezes, se tornam inviáveis em apenas uma máquina isolada. Para isso, a arquitetura do iPython já foi projetada visando dar suporte a execução paralela de comandos. Veja mais em: http://minrk.github.com/scipy-tutorial-2011/parallel_intro.html
  • Interface Web: também é possível acessar um ambiente iPython através de uma interface web.
  • E muito mais: para descobrir, execute o iPython e digite %quickref para ler a referência.
iPython

Tela do iPython

Na minha opinião, esse é um ambiente feito especialmente para quem passa o dia inteiro imerso em um shell Python e precisa de uma solução mais completa para facilitar o seu dia-a-dia. Excelente para a experimentação típica de quem trabalha com pesquisa científica, também pode ser muito bem aproveitado por programadores Python que desejam um shell mais completo. Recomendo!

Alternativas ao shell Python padrão

O shell padrão disponível quando instalamos Python em um sistema é um tanto quanto básico, não oferecendo recursos úteis ao desenvolvedor como completação de palavras, histórico de comandos, dentre outros recursos disponíveis através de bibliotecas como a readline. Porém, existem algumas formas de obtermos tais recursos para nosso shell, as quais serão listadas neste post. Segue uma lista das alternativas:

  1. Configurar o shell Python padrão para que, quando iniciado, carregue algumas funcionalidades da libreadline. Essa alternativa já foi coberta em um post anterior;
  2. Dreampie, um shell gráfico alternativo cheio de funcionalidades úteis, já apresentado em um post anterior;
  3. iPythonhttp://ipython.org
  4. bPythonhttp://bpython-interpreter.org
  5. Reinteracthttp://fishsoup.net/software/reinteract

Em breve, postarei textos descrevendo o iPython, o bPython e o Reinteract. Desde já, sugiro aos interessados na linguagem Python que instalem esses programas, pois possuem vários benefícios ao desenvolvedor.

Pydev = Python + Eclipse

Pydev é um plugin para a IDE Eclipse que permite criação de projetos Python usando esta IDE. Além do tradicional syntax highlighting, o Pydev oferece completação de código, operações de refatoração, verificação de erros e indicação destes no código, execução e depuração de código Python, autoimport de módulos, dentre outros recursos interessantes. Para usar o Pydev, é necessário ter o Eclipse instalado (é óbvio, né?). Para isso, vá até a página de downloads do Eclipse ou instale este via apt (sistemas Debian based):

sudo apt-get install eclipse

Após isso, a instalação do Pydev se dá utilizando a ferramenta de instalação de software do Eclipse. Os passos para instalação são os seguintes:

  1. Abra o Eclipse e vá ao menu “Help“, opção “Install new software”;
     

    Image

    Figura 1. Eclipse

  2. Adicione a URL “http://pydev.org/updates” e selecione o pacote Pydev, conforme mostra a Figura 2;

    Image

    Figura 2. Adicionando a URL do Pydev ao Eclipse

  3. Clique em Next até finalizar a instalação;
  4. Reinicie o Eclipse;
  5. Agora é necessário informar ao Pydev onde está nosso interpretador Python;
  6. Vá ao menu Window -> Preferences (Figura 3);

    Image

    Figura 3. Selecionando Interpretador

  7. Vá na opção Pydev->Intepreter – Python e clique em “New“;

    Image

    Figura 4. Selecionando o Interpretador

  8. No diálogo que abrir, preencha com os dados do seu interpretador e confirme;
  9. Após isso, aplique as alterações (botão Apply na janela mostrada na Figura 3);
  10. Pronto. O Pydev está configurado em seu Eclipse.

Agora você pode criar seu projeto Python. Vá em File -> New -> Other -> Pydev -> Pydev Project. Pronto, seu projeto está criado. Agora basta criar os arquivos .py dentro da pasta src presente no projeto.

Executar código Python diretamente no Gedit

Quem está acostumado a utilizar IDEs ou mesmo editores de texto com algum foco em programação, já deve estar familiarizado com os úteis atalhos para compilação/execução do arquivo/projeto atual. Eles agilizam bastante, pois com um pressionar de teclas é possível compilar/executar o código recém escrito.

Seguindo o post anterior, no qual escrevi sobre o uso do gedit como ambiente de desenvolvimento Python, agora vou apresentar uma forma de habilitar a execução do script atual em um terminal através de um atalho do teclado. Em primeiro lugar, é necessário habilitar o plugin “Ferramentas Externas” (Editar -> Preferências -> Plugins). Feito isso, vá até Ferramentas -> Gerenciar Ferramentas Externas e crie uma nova ferramenta como a apresentada na Figura 1.

Gerenciador de Ferramentas Externas

Figura 1. Gerenciador de Ferramentas Externas

A variável $GEDIT_CURRENT_DOCUMENT_PATH contém uma string com o caminho completo do arquivo no sistema de arquivos. Assim, solicitamos que seja aberto um novo terminal e dentro dele seja executado o arquivo atual. Para saber mais sobre as variáveis, acesse: http://library.gnome.org/users/gedit/unstable/gedit-external-tools-plugin.html.en#gedit-external-tools-plugin-variables

Feito isso, basta agora editar um arquivo .py e pressionar as teclas de atalho selecionadas (no meu caso Ctrl + Alt + r). Assim, uma janela do gnome-terminal será aberta com a execução do código-fonte atual na tela.

É isso. Essa é uma das formas de se fazer isso. Existe também o plugin Run in Python, porém este não possibilita a entrada de dados pelo teclado na tela onde o programa é executado.

Gedit como ambiente de desenvolvimento Python

O Gedit é o editor de textos padrão do GNOME. Até aí nenhuma novidade, certo? O que nem todo mundo sabe é que ele possui vários recursos que o elevam da categoria de um simples editor de textos para um ambiente de desenvolvimento bem interessante. Por padrão, o Gedit nada mais é que um simples editor de textos gráfico. Além de colorir as palavras de acordo com a sintaxe da linguagem, ele não possui outro recurso muito atrativo para desenvolvedores. Veja a Figura 1.

Image

Figura 1. Gedit sem plugins

É aí que entra a configuração das preferências do Gedit (Editar->Preferências). Dentro das Preferências, há uma aba chamada plugins, onde podemos instalar/habilitar novos plugins para o Gedit, que adicionam funcionalidades ao editor. A seguir, vou listar alguns plugins que habilitei e que tornaram o Gedit um editor mais propício ao desenvolvimento de programas Python:

  1. Bracket Completion (completação de colchetes/parênteses/chaves): faz com que o editor insira automaticamente o colchete de fechamento quando abrimos um colchete;
  2. Code Comment (comentário de código): comenta/descomenta trechos de código selecionados, através de um atalho no teclado;
  3. Embedded Terminal (terminal embutido): adiciona à parte inferior da tela um shell linux para execução de comandos. Destacado na Figura 2;
  4. File Browser Pane (painel de navegação de arquivos): mostra na lateral da tela um painel para navegar nos diretórios do sistema de arquivos, possibilitando a abertura de arquivos através deste. Destacado na Figura 2;
  5. Python Console: adiciona um shell Python à parte inferior da tela. Excelente para realização de testes rápidos. Destacado na Figura 2;
  6. Run in Python (Execute em Python): possibilita que executemos o script Python utilizando um atalho (Ctrl+F5). E o resultado da execução é mostrado na parte inferior. Download pode ser feito aqui;
  7. Snippets: completa código baseado em templates. Por exemplo, ao digitar a palavra class e pressionar <TAB>, o plugin já insere na tela um molde de código para implementação da classe;
Image

Figura 2. Gedit com plugins habilitados

Grande parte dos plugins listados acima estão disponíveis a partir da instalação do pacote gedit-plugins:

sudo apt-get install gedit-plugins

Para instalar plugins de terceiros, você deve baixá-los e extraí-los no diretório: ~/.gnome2/gedit/plugins

Além dos plugins, outras configurações são bastante úteis: mostrar numeração de linhas (nas preferências do gedit), substituir TABs por espaços, dentre outras, que vão da preferência do usuário.

List Comprehensions

Desde sua versão 2.0, Python oferece uma construção chamada list comprehensions, que é capaz de gerar listas de valores de forma bastante clara e concisa. Considere a notação matemática de conjunto, utilizada para descrever um conjunto composto pelo dobro de cada um dos números naturais de 0 até 9:

Image

Tal notação descreve um conjunto de elementos através de propriedades que seus elementos devem satisfazer. A expressão acima pode também ser lida como:

S é um conjunto que contém como elementos os dobros de todos números naturais menores que 10.

Resultando no seguinte conjunto:

{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}

Em Python, é possível descrevermos uma lista através de uma construção semelhante à notação matemática para descrição de conjuntos. Veja o exemplo abaixo, que apresenta tal construção, chamada de list comprehensions:

>>> S = [x*2 for x in range(0, 10)]
>>> print S
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Como podemos ver, foi gerada uma lista com os quadrados dos números de 0 a 9. Ou seja, a expressão acima pode ser lida como:

Gere uma lista contendo o dobro de cada número inteiro na faixa de 0 a 9.

Também é permitido que sejam utilizadas expressões condicionais dentro de list comprehensions:

>>> S = [x*2 for x in range(0,10) if x % 2 == 0]
>>> print S
[0, 4, 8, 12, 16]

Ou seja, gere uma lista contendo o dobro de todo elemento x, sendo x um número entre 0 e 9, se x for um número par. O seguinte trecho de código obtém o mesmo resultado, sem a utilização de list comprehensions.

S = []
for x in range(0,10):
    if x % 2 == 0:
        S.append(x*2)

Apesar de inspirada na notação matemática, essa construção também pode ser utilizada para conjuntos não-numéricos:

>>> [s.capitalize() for s in ['um', 'dois', 'tres']]
['Um', 'Dois', 'Tres']

Também é possível gerar uma lista de listas como resultado:

>>> [[s.capitalize(), s.upper(), len(s)] for s in ['um', 'dois', 'tres']]
[['Um', 'UM', 2], ['Dois', 'DOIS', 4], ['Tres', 'TRES', 4]]

Ou então, uma lista de tuplas:

>>> [(s.capitalize(), s.upper(), len(s)) for s in ['um', 'dois', 'tres']]
[('Um', 'UM', 2), ('Dois', 'DOIS', 4), ('Tres', 'TRES', 4)]

Como você pode ver, a estrutura de list comprehensions é bastante flexível. Descubra mais detalhes em: http://docs.python.org/tutorial/datastructures.html#list-comprehensions

Dreampie, o shell python que você sempre sonhou!

Para quem sente dificuldades em utilizar o shell padrão fornecido com o Python, seja por achá-lo simples demais ou por sentir falta de recursos mais comuns em IDEs mais completas, existe uma alternativa ao shell tradicional que é muito interessante e auxilia bastante na tarefa do desenvolvimento, sem perder as vantagens de um shell: um local para teste rápido de trechos de código Python. Estou falando do Dreampie, cujo slogan é: “O shell python que você sempre sonhou“. Abaixo, segue uma lista de recursos que julgo atraentes tanto para novatos quanto para programadores experientes na linguagem:

  • Completação de nomes de funções com menu visual
  • Apresentação de breve documentação da função, mostrando quais e quantas entradas tal função recebe, bem como seu valor de retorno
  • Possibilita a digitação de uma função completa (multi-linhas), para interpretação dela como um todo, após finalizada
  • Armazenamento e carregamento do histórico dos comandos digitados em outra sessão

Para instalá-lo em seu sistema Ubuntu 10.10, execute os seguintes comando em um terminal:

sudo apt-get install dreampie

Para sistemas operacionais Windows, Mac OS ou versões anteriores do Ubuntu, o Dreampie também pode ser baixado diretamente da página do projeto: http://dreampie.sourceforge.net/download.html

Abaixo, vemos uma figura ilustrando a tela do dreampie:

Captura de tela do Dreampie

Figura 1. Dreampie e opções de completação

A Figura 2 mostra uma das características mais interessantes do dreampie, que é o desenvolvimento de funções/classes inteiras para posterior interpretação pelo Python.

Image

Figura 2. Uma função no dreampie

É isso, instale o dreampie e tire suas próprias conclusões.