Imagine que você deseja desenvolver um aplicativo de desktop do usuário final não trivial (não da Web) em Python. Qual é a melhor maneira de estruturar a hierarquia de pastas do projeto?
Os recursos desejáveis são: facilidade de manutenção, compatibilidade com o IDE, adequação para ramificação / mesclagem de controle de origem e geração fácil de pacotes de instalação.
Em particular:
- Onde você coloca a fonte?
- Onde você coloca os scripts de inicialização do aplicativo?
- Onde você coloca o cruft do projeto IDE?
- Onde você coloca os testes de unidade / aceitação?
- Onde você coloca dados não-Python, como arquivos de configuração?
- Onde você coloca fontes não Python, como C ++, para módulos de extensão binária pyd / so?
De acordo com a estrutura do sistema de arquivos de Jean-Paul Calderone de um projeto Python :
fonte
Project/project/
? Ah, o segundo é o nome do pacote.../
em uma instrução include)pip install -e /path/to/Project
)-e
sinalizador, que instala o pacote como um pacote editável, ou seja, instala-o como links para a pasta real do projeto. O executável pode apenasimport project
ter acesso ao módulo.Esta postagem de blog de Jean-Paul Calderone geralmente é dada como resposta em #python no Freenode.
fonte
Confira Open Sourcing a Python Project the Way Right .
Deixe-me extrair a parte do layout do projeto desse excelente artigo:
fonte
Makefile
no mesmo nível quesetup.py
? Então, se eu entendo que vocêmake env
automatiza corretamente a criação de um novovenv
e instala os pacotes nele ...?O "Python Packaging Authority" possui um exemplo de projeto:
https://github.com/pypa/sampleproject
É um projeto de amostra que existe como uma ajuda ao Tutorial do Python Packaging User Guide sobre empacotando e distribuindo projetos.
fonte
root/src/*
estrutura: github.com/pypa/sampleproject/commit/…Tente iniciar o projeto usando o modelo python_boilerplate . Ele segue amplamente as melhores práticas (por exemplo, as aqui ), mas é mais adequado se você estiver disposto a dividir seu projeto em mais de um ovo em algum momento (e acredite, com qualquer coisa, menos nos projetos mais simples, você o fará. situação comum é onde você deve usar uma versão modificada localmente da biblioteca de outra pessoa).
Onde você coloca a fonte?
PROJECT_ROOT/src/<egg_name>
.Onde você coloca os scripts de inicialização do aplicativo?
entry_point
um dos ovos.Onde você coloca o cruft do projeto IDE?
PROJECT_ROOT/.<something>
raiz do projeto, e isso é bom.Onde você coloca os testes de unidade / aceitação?
PROJECT_ROOT/src/<egg_name>/tests
diretório. Eu pessoalmente prefiro usarpy.test
para executá-los.Onde você coloca dados não-Python, como arquivos de configuração?
pkg_resources
pacotesetuptools
ou desde o Python 3.7 através doimportlib.resources
módulo da biblioteca padrão.PROJECT_ROOT/config
. Para implantação, pode haver várias opções. No Windows, pode-se usar%APP_DATA%/<app-name>/config
, no Linux/etc/<app-name>
ou/opt/<app-name>/config
.PROJECT_ROOT/var
durante o desenvolvimento e/var
durante a implantação do Linux.PROJECT_ROOT/src/<egg_name>/native
A documentação normalmente entra
PROJECT_ROOT/doc
ouPROJECT_ROOT/src/<egg_name>/doc
(isso depende se você considera alguns dos ovos como grandes projetos separados). Algumas configurações adicionais estarão em arquivos comoPROJECT_ROOT/buildout.cfg
ePROJECT_ROOT/setup.cfg
.fonte
base_data_location
variável, mas como você a define adequadamente?Na minha experiência, é apenas uma questão de iteração. Coloque seus dados e código onde quer que eles achem. As chances são de que você estará errado de qualquer maneira. Mas uma vez que você tenha uma idéia melhor de como as coisas vão melhorar, você estará em uma posição muito melhor para fazer esse tipo de palpite.
Quanto às fontes de extensão, temos um diretório de código no tronco que contém um diretório para python e um diretório para várias outras linguagens. Pessoalmente, estou mais inclinado a tentar colocar qualquer código de extensão em seu próprio repositório na próxima vez.
Com isso dito, volto ao meu ponto inicial: não faça grandes negócios com isso. Coloque em algum lugar que pareça funcionar para você. Se você encontrar algo que não funciona, ele pode (e deve) ser alterado.
fonte
Os dados não-python são melhor agrupados em seus módulos Python usando o
package_data
suporte em setuptools . Uma coisa que eu recomendo é usar pacotes de namespace para criar namespaces compartilhados que vários projetos podem usar - bem como a convenção Java de colocar pacotescom.yourcompany.yourproject
(e poder ter umcom.yourcompany.utils
namespace compartilhado ).Ramificando e mesclando, se você usar um sistema de controle de fonte suficientemente bom, ele manipulará mesclagens mesmo através de renomeações; Bazar é particularmente bom nisso.
Ao contrário de outras respostas aqui, eu tenho +1 em ter um
src
diretório de nível superior (comdoc
etest
diretórios ao lado). Convenções específicas para árvores de diretórios de documentação variarão dependendo do que você estiver usando; O Sphinx , por exemplo, possui suas próprias convenções, suportadas por sua ferramenta de início rápido.Por favor, aproveite setuptools e pkg_resources; isso torna muito mais fácil para outros projetos confiar em versões específicas do seu código (e que várias versões sejam instaladas simultaneamente com arquivos diferentes de código, se você estiver usando
package_data
).fonte