Definição de estrutura de diretórios de projetos python

Posted on 12 \d\e novembro \d\e 2009. Filed under: computers, irc, python |

Uma dúvida que sempre surge é como definir a estrutura de pastas para um novo projeto. Eu sempre sigo estas dicas que vou passar agora, pois elas permitem uma grande facilidade de instalar, testar e distribuir o código, e assegura que ele se comportará corretamente em todas as plataformas.

  • Crie uma pasta para seu projeto. Por exemplo, se seu projeto se chama NetoChat, crie uma pasta NetoChat para ser a raiz do seu projeto. Quando você lançar uma versão, inclua um sufixo de versão: NetoChat-2.5
  • Crie dentro desta pasta um pacote python para conter o fonte do seu projeto. Dê a ela um nome sem traços e sem espaços, somente com letras minúsculas. Exemplo: NetoChat/netochat. Crie um arquivo __init__.py vazio dentro desta pasta para que ela seja considerada um pacote. NetoChat/netochat/__init__.py
  • Coloque seus módulos lá dentro do pacote: NetoChat/netochat/interface.py NetoChat/netochat/rede.py
  • Você também pode organizar em subpacotes. Primeiro crie NetoChat/netochat/eventos/__init__.py para criar um pacote eventos. Em seguida crie seus módulos lá dentro, por exemplo, NetoChat/netochat/eventos/som.py Fazendo desta forma, estes módulos podem ser chamados facilmente de forma absoluta, sem ambiguidades nem confusões. Exemplos:
    • from netochat.eventos import som
    • from netochat import rede
  • Crie uma pasta NetoChat/bin onde você colocará seus executáveis. Estes executáveis devem ser scripts python sem a extensão .py, que possuem somente uma linha importando e executando uma função que deve estar definida em outro ponto do projeto. Não coloque o código em si nestes scripts, apenas a chamada. Exemplo, NetoChat/bin/nchat:
    • from netochat.interface import main_window ; main_window()
  • Ponha seus testes de unidade em um outro pacote python. Mais uma vez, isto implica em criar o pacote (NetoChat/tests/__init__.py)  e colocar seus testes lá (NetoChat/tests/test_rede.py, NetoChat/tests/test_interface.py)
  • Adicione alguns arquivos que é sempre bom ter:
    • NetoChat/setup.py – programa de instalação criado com distutils para instalar seu programa e registrá-lo automaticamente;
    • NetoChat/README – descrição do seu programa;
    • NetoChat/LICENSE – licença de distribuição do seu código;
    • NetoChat/TODO, NetoChat/INSTALL, etc

A estrutura do código ficaria assim:

  • NetoChat/
    • setup.py
    • README
    • bin/
      • nchat
    • netochat/
      • __init__.py
      • interface.py
      • rede.py
      • eventos
        • __init__.py
        • som.py
      • tests/
        • __init__.py
        • test_interface.py
        • test_rede.py

Por favor, não faça, repito, não faça as coisas abaixo:

  • NÃO coloque seu código fonte em uma pasta chamada lib ou src – dificulta a execução do seu código sem instalá-lo.
  • NÃO ponha seus testes fora do pacote python principal do seu projeto – dificulta a execução dos testes em uma versão instalada do código
  • NÃO crie um pacote com apenas um __init__.py e ponha o código todo em __init__.py. Simplesmente crie um módulo comum ao invés de um pacote. É mais simples.
  • NÃO tente criar gambiarras e usar magia negra para fazer seu módulo ser importável sem que o usuário tenha que adicioná-lo ao caminho de importação dele (através de PYTHONPATH, setup.py ou qualquer outro mecanismo). Você com certeza vai deixar algo faltando e seu programa não vai rodar em alguma plataforma ou caso específico se você tentar assim. Simplesmente crie o setup.py usando distutils e ele fará a coisa certa automaticamente.

Leia em seguida a conversa de irc que deu origem a este post (uma das muitas vezes que respondi essa dúvida):

<xNetoXMartinsx> nosklo, estou começando ainda… sorry!
<nosklo> xNetoXMartinsx: sim, sim, veja vou te explicar
<nosklo> xNetoXMartinsx: suponha q seu projeto seja um cliente de IRC e chame NetoChat
<nosklo> xNetoXMartinsx: vc cria uma pasta NetoChat para conter o projeto
<nosklo> xNetoXMartinsx: dentro desta pasta vc coloca os arquivos setup.py (instalador do seu projeto), README, etc
<xNetoXMartinsx> e todos os módulos eu coloco dentro daquela mesma pasta?
<nosklo> xNetoXMartinsx: dai vc cria uma pasta NetoChat/netochat que é o pacote python do seu projeto
<nosklo> xNetoXMartinsx: dentro vc cria um arquivo NetoChat/netochat/__init__.py vazio
<nosklo> xNetoXMartinsx: dai vc pode criar outras subpastas, como NetoChat/netochat/comunica.py, NetoChat/netochat/tela.py NetoChat/netochat/eventos/som.py NetoChat/netochat/eventos/email.py
<nosklo> xNetoXMartinsx: crie um NetoChat/netochat/principal.py que vai ser o seu programa principal, dentro de uma funcao def main()
<nosklo> xNetoXMartinsx: dai vc gera um NetoChat/bin/nchat.py que dá um “from netochat.principal import main ; main()”
<nosklo> xNetoXMartinsx: se dentro de principal.py vc precisa de comunica.py vc pode fazer: from netochat import comunica
<nosklo> xNetoXMartinsx: from netochat.eventos import som
<nosklo> xNetoXMartinsx: crie tbm um NetoChat/netochat/tests e ponha seus testes la
<xNetoXMartinsx> nosklo, cara, você me ensinou tudo que eu tava querendo saber
<xNetoXMartinsx> kkkkkkkkkkkk
<nosklo> xNetoXMartinsx: a documentação vc poe em NetoChat/doc
<xNetoXMartinsx> nosklo, você é o cara mano!
<xNetoXMartinsx> nosklo, eu vou é copiar essa conversa e salvar!!!
<xNetoXMartinsx> kkkkkkkkkkkkkkkkkkk
<nosklo> xNetoXMartinsx: vou postá-la no meu blog
<nosklo> xNetoXMartinsx: agora
<nosklo> xNetoXMartinsx: pythonlog.wordpress.com
<nosklo> xNetoXMartinsx: qdo lançar seu programa, copie ele para NetoChat-1.0
<nosklo> xNetoXMartinsx: se compactar, fica NetoChat-1.0.tar.gz

Anúncios

Make a Comment

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Uma resposta to “Definição de estrutura de diretórios de projetos python”

RSS Feed for foobar + h2o Comments RSS Feed

Cara, mais uma vez gostaria de agradecer todas as dicas. Os estudos continuam avançando, e aos poucos vou chegando ao objetivo.
Parabéns pela iniciativa.
[]’s

xNetoXMartinsx


Where's The Comment Form?

  • Blog Stats

    • 4,163 hits
  • contribua!

Liked it here?
Why not try sites on the blogroll...