Módulo Python (2.4 / 2.7) não reconhecido

Iniciado por bred81, 25 de Abril de 2014, 16:02

tópico anterior - próximo tópico

bred81

Então, encontrei vários casos similares no StackOverflow e até aqui no fórum mas não um que eu me encaixasse.
Eu tenho a seguinte estrutura:
pasta_pai/
pasta_pai/pasta1/
pasta_pai/pasta1/script.py
pasta_pai/pasta2/
pasta_pai/pasta2/modules/
pasta_pai/pasta2/modules/python/
pasta_pai/pasta2/modules/python/moduloPai/
pasta_pai/pasta2/modules/python/moduloPai/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/modulo1.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/modulo2.py


Eu preciso rodar o "script.py" mas preciso deixar os módulos que criei nesta estrutura.
No meu script estou chamando assim:
#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys
import datetime

# sys.path.append("../modules/python/") -> não posso usar isso pois o python 2.4 não aceita.
from moduloPai.moduloFilho1 import modulo1
from moduloPai.moduloFilho1 import modulo2


Mas continua me dando o erro:
Traceback (most recent call last):
 File "./scriptpy", line 9, in <module>
   from  moduloPai.moduloFilho1 import modulo1
ImportError: No module named moduloPai.moduloFilho1


Na documentação do Python que eu encontrei, não tem especificando se essa organização deve ser em pastas abaixo de onde estou executando ou pode ser em qualquer lugar do sistema.
Acredito que deva ser abaixo de onde estou executando (o que não é uma opção) pois o Python não sabe que tem que procurar lá.
Alguma solução para este caso?
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...

irtigor

#1
Acredito que "__init__.py" tem que aparecer em todos os subdiretórios, sem ele no pasta2... e nas outras, a busca deve ser encerrada pelo python. Mas deve funcionar se você linkar moduloPai dentro de pasta1.

Outra coisa é que o sys.path deve funcionar, ou a variável PYTHONPATH, mas o caminho tem que estar correto, então ou usa caminho absoluto ou algo como:


filedir = os.path.dirname(os.path.realpath(__file__))
moddir =  os.path.join(filedir, '../pasta2/modules/python/moduloPai')


Com isso no script.py você vai conseguir o caminho correto até ele, independente do diretório atual, então usa o relativo dele até o diretório dos módulos.

bred81

Nesse caso eu teria que por o __init__.py em na pasta pai das duas pastas, o que, acho, não ficaria uma boa prática.
Eu vou testar umas soluções que encontrei na net e daqui a pouco posto aqui o que escolhi.
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...

bred81

Achei a solução:

Citar

Você pode estar fazendo isso de modo elegante utilizando o módulo Imp.

Olhe para as funções find_module e load_module.

find_module: Vai procurar o módulo pelo nome, se a pesquisa for bem sucedida, o valor de retorno é uma tupla de 3 elementos (arquivo, caminho, e descrição).

load_module: Essa função vai carregar o módulo, se o módulo já foi importado então será equivalente a um reload(). Se você conseguir carregar com sucesso o valor de retorno é um objeto apontando para o módulo.

Veja um exemplo:

import imp

f, filename, desc = imp.find_module('Foo', ['/pasta2/modules/python/pasta3/'])
modulo1 = imp.load_module('Foo', f, filename, desc)

modulo1.funcao1()


De: http://pt.stackoverflow.com/questions/14043/como-colocar-um-modulo-python-numa-pasta-diferente-do-meu-script
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...