Criando vários módulos Python em diferentes diretórios que compartilham uma parte da estrutura do pacote

Eu estou trabalhando em um projeto Django que contém um único aplicativo. O aplicativo será lançado sob a GPL, então eu quero desenvolvê-lo separadamente do projeto - um site pessoal usando o aplicativo. Eu estou tentando usar uma estrutura de pacote com base no meu nome de domínio para o projeto e o aplicativo, e é aí que estou me deparando com problemas.

Aqui está minha estrutura de arquivos (com arquivos __init__.py, quando apropriado):

$HOME/django-sites/mydomain
$HOME/django-apps/mydomain/cms

E meu PYTHONPATH:

$HOME/django-sites:$HOME/django-apps

Se eu iniciar um interpretador Python (de qualquer diretório no sistema de arquivos), posso importar classes do site, mas não do aplicativo. Se eu inverter a ordem das duas entradas no PYTHONPATH (primeiro aplicativos, depois sites), posso importar do aplicativo, mas não do site.

Parece que o Python está tentando importar apenas da primeira entrada no PYTHONPATH que contém a primeira parte do nome do pacote. Isso está correto? Esse comportamento é esperado? Se assim for, só posso colocar módulos em estruturas de pacotes como domain / app1, domain / app2 se eles viverem na mesma estrutura de diretórios - independentemente do PYTHONPATH.

Não é show-stopper porque eu posso renomear o site, mas é muito diferente do que eu esperava. O tutorial do Python menciona __path__, mas não tenho ideia de como usá-lo:

Pacotes suportam mais um atributo especial, __path__. Isso é inicializado como uma lista contendo o nome do diretório que contém o pacote __init__.py antes que o código desse arquivo seja executado. Essa variável pode ser modificada; isso afeta futuras pesquisas de módulos e subpacotes contidos no pacote.

Embora esse recurso não seja frequentemente necessário, ele pode ser usado para estender o conjunto de módulos encontrados em um pacote.

Alguém mais se deparou com isso? Existe algo que eu possa fazer com __path__ para fazer essa função como esperado?

questionAnswers(3)

yourAnswerToTheQuestion