Importação de módulos da pasta principal

Estou a executar o Python 2.5.

Esta é a minha árvore de pastas:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(Eu também tenho __init__.py em cada pasta, omitido aqui para legibilidade)

Como importar o módulo nib de dentro do módulo life? Eu espero que seja possível fazer sem mexer no sys.path.

Nota: O módulo principal a ser executado está na pasta ptdraft.

Você poderia usar importações relativas (python >= 2,5):

from ... import nib

(What's New in Python 2.5) PEP 328: Importações Absolutas e Relativas

EDIT: adicionado outro ponto '.' para subir dois pacotes

Comentários (10)
Solução

Parece que o problema não está relacionado com o módulo estar em um diretório pai ou algo parecido.

Você precisa adicionar o diretório que contém o ptdraft ao PYTHONPATH

Você disse que "import nib" funcionou com você, isso provavelmente significa que você adicionou o próprio ptdraft (não seu pai) ao PYTHONPATH.

Comentários (2)

Se adicionar sua pasta de módulos ao PYTHONPATH não't funcionar, Você pode modificar a lista **sys.path*** no seu programa onde o intérprete Python procura os módulos a importar, a documentação python diz:

Quando um módulo chamado spam é importado, o intérprete primeiro procura um módulo incorporado com esse nome. Se não for encontrado, ele então procura por um arquivo chamado spam.py em uma lista de diretórios dada pela variável sys.path. sys.path é inicializado a partir desses locais:

  • o diretório que contém o script de entrada (ou o diretório atual).
  • PYTHONPATH (uma lista de nomes de directórios, com a mesma sintaxe que a variável da shell PATH).
  • o padrão dependente da instalação.

Após a inicialização, os programas Python podem modificar **sys.path***. O diretório contendo o script sendo executado é colocado no início do caminho de pesquisa, à frente do caminho padrão da biblioteca. Isto significa que os scripts nesse diretório serão carregados em vez dos módulos com o mesmo nome no diretório da biblioteca. Isto é um erro, a menos que a substituição seja pretendida.

Sabendo disso, você pode fazer o seguinte em seu programa:

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
Comentários (3)