Segue para o conteúdo

25 de abril de 2010

10

Trabalhando com Python e Django à moda Osvaldo

Esse post está aqui para ser usado por mim como referência futura mas, como pode ser útil para outras pessoas vou deixá-lo público aqui no blog.

Software

Trabalhei muito tempo com Linux (e alguns outros Unices) e de três anos pra cá sou mais um Apple Fanboy que usa o excelente OS X. Mas acho que boa parte das dicas aqui ainda são úteis para usuários de Linux.

  • Terminal.app – Porque Mac é máquina pra ‘macho’ :D
  • bash – Pesadão, bloat, mas não consegui me habituar com outro. É o default do OS X.
  • Vim – Esse é o editor pra tudo. É difícil de aprender a usar mas é um F1. Depois que aprendemos a lidar com ele a gente voa. Uso a versão texto que acompanha o OS X.
  • TextMate – Esse eu uso para o desenvolvimento ‘pesado’. Dá pra usar o Vim pra isso também. Mas dependendo do meu humor eu escolho o TextMate para algumas coisas.
  • Rudix – O OS X não vem com tudo mas você encontra o que falta no Rudix.
  • Git – Uso o git pros meus projetos mas também tenho o Mercurial, Bazaar, Subversion, … instalados para contribuir com outros projetos open-source
  • virtualenv – ter um ambiente isolado para cada projeto Python onde você trabalha é muito legal. Já escrevi sobre o virtualenv aqui.
  • pylint e pyflakes – Analisadores estáticos de código.

Diretórios básicos

  • $HOME/
    • Work – Diretório onde os projetos em que trabalho ficam.
    • bin – Diretório com scripts, binários estáticos, etc. Esse diretório fica no $PATH

Configuração

Sempre que eu falar sobre um arquivo de configuração específico você pode encontrá-lo no endereço: http://github.com/osantana/personal.

Os arquivos ‘.’ (ponto)

.profile

  • Configurar 3 aliases: mv='mv -i' e cp='cp -i' pra evitar acidentes com arquivos sendo sobrescritos e ls='ls -G' para habilitar cores no comando ls.
  • Configurações genéricas para cores no terminal
  • Definir o vim como EDITOR padrão.
  • Definir LANG e LC_CTYPE como en_US.UTF-8 para que o Mercurial e alguns outros softwares funcionem corretamente.
  • Adicionar o diretório $HOME/bin ao $PATH. Nesse diretório eu jogo todos aqueles programinhas utilitários usados no dia a dia.
  • Configurações Python:
  • Configuração Java: export JAVA_HOME="/Library/Java/Home"
  • Configuração Ruby: adicionar $HOME/.gem/ruby/1.8/bin ao $PATH
  • Eu uso virtualenv em todos os meus projetos então crio duas funções para ativar os ambientes e entrar nos diretórios desses projetos:
    # Uso: p nome_do_projeto
    p() {
        cd ~/Work/$1*
        [ -f bin/activate ] && source bin/activate
    }
     
    # Uso: c
    c() {
        [ -d "$VIRTUAL_ENV" ] && cd $VIRTUAL_ENV
    }

.gitconfig

[user]
	name = Osvaldo Santana
	email = osantana na triveos.com
[color]
	status = auto
	diff = auto
	branch = auto
	ui = auto
	grep = auto
[alias]
	st = status
	ci = commit
	co = checkout
[merge]
	tool = opendiff
[core]
	legacyheaders = false
	excludesfile = /Users/osantana/.gitignore
    whitespace = trailing-space,space-before-tab
[apply]
    whitespace = fix
[repack]
	usedeltabaseoffset = true
[git-tmbundle]
	gitx-path = /Application/GitX.app/
[mergetool "opendiff"]
	cmd = opendiff
	trustExitCode = true
[clean]
	requireForce = false

.gitignore

.DS_Store
*.py[co]
*.tmproj
*~
*.swp*

.inputrc

Eu uso o modo vi também no console. Neste arquivo fica essa configuração e mais umas outras que deixam o comportamento do prompt do Mac mais parecido com o do Linux.

Já falei sobre essas configurações aqui no blog. Use por conta e risco.

.pylintrc

As configurações que eu uso para análise estática do código que eu produzo. Eu rodo o pylint antes de fazer o commit do meu código. Durante o desenvolvimento eu uso somente o pyflakes que é mais simples e rápido mas faz uma análise mais superficial do código. Eu costumava usar o pep8.py mas já faz um tempo que o aposentei.

.pystartup.py

Script executado pelo interpretador Python ao entrar no modo interativo. Eu configuro o ‘auto-completion’ do prompt interativo do Python, gravo o histórico de comandos, etc.

Infelizmente ele não funciona com o Python padrão do Mac porque o mesmo não é compilado com a biblioteca readline. Mas no Linux ele (deve) funcionar certinho.

.vimrc

Esse é o meu famoso arquivo .vimrc. Ele não tem nada de muito especial.

Outros arquivos

Existem outros arquivos mas, nestes casos, eles contém informações privativas e não faria sentido colocar aqui pra vocês :)

Criando e Usando um projeto Python (com Django)

Para exemplificar vamos criar um projeto “pythonologia”:

~ $ cd ~/Work
Work $ virtualenv --no-site-package pythonologia
New python executable in pythonologia/bin/python
Installing setuptools............done.
Work $ p pythonologia
(pythonologia) pythonologia $ easy_install django
(pythonologia) pythonologia $ django-admin.py pythonologia
(pythonologia) pythonologia $ cd pythonologia
(pythonologia) pythonologia $ git init
(pythonologia) pythonologia $ git add *.py
(pythonologia) pythonologia $ git commit -m "Initial commit"

Projeto criado e a estrutura de diretórios vai ficar mais ou menos assim:

~/Work/pythonologia
       |____ pythonologia
       |     |____ app_django1
       |      \___ app_django2
       |____ bin
       |____ include
        \___ lib
             \____ python2.6
                   |____ distutils
                    \____ site-packages

Os arquivos que não são mantidos no repositório Git ficam no diretório ~/Work/pythonologia ou em um diretório ~/Work/pythonologia/files. O arquivo de projeto do Textmate, por exemplo, fica em ~/Work/pythonologia/pythonologia.tmproj.

Eu também crio um link simbólico ~/Work/pythonologia/django -> ~/Work/pythonologia/lib/pythonX.X/site-package/Django-1.1.1-py2.6.egg/django para dar uma ‘espiada’ no código do Django quando necessário.

Quando eu quero trabalhar num outro projeto eu faço:

(pythonologia) pythonologia $ deactivate
pythonologia $ p outro_projeto
(outro_projeto) outro_projeto $

Eu estou num diretório qualquer e quero voltar para o diretório raiz do projeto basta fazer:

(pythonologia) ~ $ c
(pythonologia) pythonologia $
A Triveos é especializada no desenvolvimento de aplicações Web e utiliza Python e Django em grande parte de seus projetos. Tendo como base esse know-how no uso de Python e Django criamos o Curso de Desenvolvimento Web com Python e Django nas modalidades in-company e online.
Leia mais sobre geral
  • http://dmmartins.appspot.com/ diego

    Muito interessante o artigo.
    Tu adicionas o código do Django em todos os projetos.
    Existe alguma razão pra isso? Evitar problemas com versões?

  • http://dmmartins.appspot.com/ diego

    Muito interessante o artigo.
    Tu adicionas o código do Django em todos os projetos.
    Existe alguma razão pra isso? Evitar problemas com versões?

  • http://www.pythonologia.org/ Osvaldo Santana

    Eu dou easy_install pra instalar o último release estável do Django dentro de cada ambiente virtual.

    Faço isso pra garantir que estou trabalhando com a versão específica do Django em cada projeto.

    Mas é possível, por exemplo, instalar o Django no sistema (sudo easy_install django) e, ao criar o ambiente virtual, não usar o parâmetro ‘–no-site-packages’ no virtualenv.

    Acho que a ‘tranquilidade’ de saber exatamente qual versão do Django está rodando naquele projeto “paga” o espaço consumido em disco.

    Quando o projeto usa a versão trunk do Django eu não uso easy_install… eu faço um symlink para um diretório onde vive um ‘checkout’ do django/trunk.

  • http://www.pythonologia.org/ Osvaldo Santana

    Eu dou easy_install pra instalar o último release estável do Django dentro de cada ambiente virtual.

    Faço isso pra garantir que estou trabalhando com a versão específica do Django em cada projeto.

    Mas é possível, por exemplo, instalar o Django no sistema (sudo easy_install django) e, ao criar o ambiente virtual, não usar o parâmetro ‘–no-site-packages’ no virtualenv.

    Acho que a ‘tranquilidade’ de saber exatamente qual versão do Django está rodando naquele projeto “paga” o espaço consumido em disco.

    Quando o projeto usa a versão trunk do Django eu não uso easy_install… eu faço um symlink para um diretório onde vive um ‘checkout’ do django/trunk.

  • http://nosleepforyou.blogspot.com Dorneles Tremea

    Fala Osvaldo,

    para fazer o auto-completion também funcionar no OS X tu podes usar a dica do StackOverflow:

    http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal

    –deo

  • http://nosleepforyou.blogspot.com Dorneles Tremea

    Fala Osvaldo,

    para fazer o auto-completion também funcionar no OS X tu podes usar a dica do StackOverflow:

    http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal

    –deo

  • http://www.pythonologia.org/ Osvaldo Santana

    Oi Deo,

    Eu até já tinha tentado isso no Leopard mas não funcionou também. Aí eu desisti e não fui mais atrás disso porque comecei a usar o ipython. Se você ver o meu pystartup.py tem até umas ‘sobras’ dessa dica.

    Mas de qualquer forma é bom deixar o link aqui pra que outras pessoas possam pegar :)

  • http://www.pythonologia.org/ Osvaldo Santana

    Oi Deo,

    Eu até já tinha tentado isso no Leopard mas não funcionou também. Aí eu desisti e não fui mais atrás disso porque comecei a usar o ipython. Se você ver o meu pystartup.py tem até umas ‘sobras’ dessa dica.

    Mas de qualquer forma é bom deixar o link aqui pra que outras pessoas possam pegar :)

  • http://www.diofeher.net/ Diógenes A. Fernandes Hermínio

    Vocês conhecem o virtualenvwrapper (http://www.doughellmann.com/projects/virtualenvwrapper/) ?
    Ele funciona uma beleza com o virtualenv :)

  • Klaus

    Excelente artigo Osvaldo! Muito esclarecedor…